باستخدام Int كمعلمة نوع ل java.util.dictionary
-
18-09-2019 - |
سؤال
عندما أحاول الإعلان عن قاموس على هذا النحو:
private Dictionary<String, int> map;
يعطيني المحول البرمجي الخطأ التالي:
خطأ في بناء الجملة على الرمز "int"، الأبعاد المتوقعة بعد هذا الرمز المميز
لكنه يعمل بشكل جيد مع Integer
. وبعد أنا أدرك غامضة أن جافا يعامل int
/ Integer
بشكل مختلف (لقد جئت من خلفية .NET)، لكنني كنت آمل أن يعطيني شخص ما شرحا كاملا على السبب لا أستطيع استخدام البدائيات في القاموس <>
المحلول
في جاوة البدائية ليست كائنات، لذلك لا يمكنك استخدامها بدلا من الكائنات. ومع ذلك، سيقوم Java تلقائيا / Unbox Primitives (AKA الاسترجة) إلى كائنات حتى تتمكن من فعل أشياء مثل:
List<Integer> intList = new LinkedList<Integer>();
intList.add(1);
intList.add(new Integer(2));
...
Integer first = intList.get(0);
int second = intList.get(1);
ولكن هذا هو حقا مجرد مترجم محول تلقائيا لأنواع لك.
نصائح أخرى
في .NET، يتم دعم أنواع "البدائية" بالأشياء. في جافا، هناك تمييز شاق بين الأنواع والكائنات البدائية. قدمت Java 5 التمثال التمهيدي، والتي يمكنها إكراه بين الاثنين في بعض الحالات. ومع ذلك، نظرا لأن نظام Java Generics يستخدم محو النوع، لا توجد معلومات كافية من Autobox في هذه الحالة.
مجموعات Java تسمح فقط بالمراجع غير بيئيتين. تحتاج إلى استخدام فصول التفاف (في هذه الحالة java.lang.inger) للقيام بما أنت عليه بعد:
private Dictionary<String, Integer> map;
انهم يمكنك القيام بأشياء مثل:
int foo = map.get("hello");
و
map.put("world", 42);
وتستخدم جافا التميري / إلغاء العلاج للتعامل مع تفاصيل التحويل لك.
هنا هو وصف بسيط على ذلك.
للتوسع في إجابة Tofubeer.
int هو بدائية
عدد صحيح هو كائن.
Generics لا يدعم البدائيات.
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)
هذه الحيلة تحدد النوع لجعله يعمل مع البدائيات
في المحول الخاص بك
باستخدام نفسه في معلومات الحزمة يعني أنك تفعل ذلك على مستوى العالم لهذه الحزمة
وجدت هذا بعد التجربة.
public class MyAdapter extends XmlAdapter<String, Integer> {
لأنه في جاوة البدائيات هي بدائريين حقا. في جاوة int
سوف تمر بقيمة، في حين Integer
سوف تمر مرجع. في .NET INT أو INT32 وما إلى ذلك هي مجرد أسماء مختلفة.