جافا:ما الفرق بين autoboxing و casting؟
-
20-08-2019 - |
سؤال
هذا السؤال يدور حول "لماذا يجعل التشغيل التلقائي بعض المكالمات غامضة في Java؟"
لكن من خلال قراءة الإجابات، هناك عدد من الإشارات إلى اختيار الممثلين ولست متأكدًا من أنني أفهم الفرق تمامًا.
هل يمكن لأحد أن يقدم تفسيرا بسيطا؟
المحلول
والملاكمة عندما قمت بتحويل نوع بدائي إلى نوع مرجع، من الامم المتحدة والملاكمة هي عكس ذلك. الصب هو عندما تريد نوع واحد إلى أن تعامل على أنها نوع آخر، بين أنواع بدائية وأنواع مرجع هذا يعني عملية الملاكمة صريحة أو ضمنية. ما إذا كان يجب أن يكون واضح هو سمة من سمات اللغة.
نصائح أخرى
يرتبط كل من الصب والملاكمة/فك الملاكمة بالأنواع والتحويل الواضح (أو الحقيقي)، ولكن الملاكمة/فك الملاكمة خاص بالعلاقة بين الأنواع البدائية وأنواع الأغلفة المقابلة لها، في حين أن الصب هو مصطلح لتغيير النوع الصريح أو الضمني في بالمعنى الأكثر عمومية.
يصب هو مصطلح عام له معنيان مرتبطان لكن مختلفان:
معالجة قيمة من نوع واحد كما لو لقد كانت قيمة من نوع آخر.مثالان على هذه الاستخدامات الأولى هما:
1.1.نظرا لتلك الفئة
B
يمتد الطبقةA
, ، يمكنك أن تطلبmyB
مثال علىB
ليتم التعامل معها كمثالA
عن طريق الكتابة((A) myB)
حيثما إشارة إلى مثيلA
يمكن أن تظهر.هذا لا ينتج في الواقع مثيلًا جديدًا لـA
.1.2.قامت مجموعات Pre-Java5 بتخزين كل المحتوى بتنسيق
Object
;يتطلب هذا عادةً استخدام طاقم الممثلين بعد استرداد كائن من المجموعة.على سبيل المثال، إذا قمت بتخزين ملفString
فيMap
وتحتاج إلى الحصول على طوله، كنت تكتب شيئا من هذا القبيل((String) myMap.get(someKey)).length()
حيث سيكون طاقم الممثلين مطلوبًا من أجل الاتصال بـlength
طريقةString
.مرة أخرى، هذا لا يسبب جديداString
ليتم انشائه.صراحة تحويل نوع إلى آخر (أيتغيير التمثيل بشكل صريح).مثال على هذا الاستخدام الثاني موجود في التعبير
((int) (float_var + 0.5F))
الذي يقوم بتقريب متغير الفاصلة العائمة عن طريق إضافة 0.5 (مما ينتج عنه قيمة الفاصلة العائمة) ثم تحويل هذه القيمة بشكل صريح إلى عدد صحيح.قيمة العدد الصحيح الناتج (بعد(int)
يلقي) هو أنتجت من القيمة الأخرى عن طريق الحساب الداخلي.
يمكن إجراء الإرسال عندما تكون هناك علاقة فئة فائقة/فئة فرعية أو علاقة بين الواجهة/المنفذ (بمعنى 1 أعلاه) أو عندما يكون النوعان عبارة عن أنواع رقمية بدائية (بمعنى 2).يمكنك البحث عن "التوسيع" و"التضييق" لمزيد من التفاصيل.
ملاكمة يشير إلى تغليف الأنواع البدائية في كائنات الحاوية، ويتم ذلك عادةً فقط عندما يجب أن يكون لديك كائن (على سبيل المثال.تخزين قيمة في مجموعة).الأنواع البدائية والمجمّعة تأتي في أزواج:
int Integer
long Long
boolean Boolean
... ...
الإخراج من العلبة يعني ببساطة استرداد القيمة الأولية من داخل غلاف الكائن الخاص بها.
اعتبارًا من Java5، عندما تكتب تعبيرًا يستخدم قيمة أولية حيث يكون نوع الغلاف المقابل مطلوبًا (مثل وضع عدد صحيح في مجموعة)، يقوم المترجم تلقائيًا بإدخال الكود الذي يغلف تلك القيمة الأولية فعليًا.وبالمثل، فإنه سيوفر لك رمز إلغاء التغليف.
لذا بدلاً من كتابة (في ما قبل Java5) شيئًا مثل:
Map myMap = new HashMap();
...
myMap.put(someKey,Integer.valueOf(3));
...
int nextValue = (myMap.get(someKey)).intValue() + 1;
يمكنك كتابة:
Map<KeyType,Integer> myMap = new HashMap<KeyType,Integer>();
...
myMap.put(someKey,3);
...
int nextValue = myMap.get(someKey) + 1;
ويتم إدراج رمز الملاكمة/الفتح بواسطة المترجم.
List<String> list = (List<String>)object;
وهو المدلى بها.
void doSomething(Integer i) { ... }
...
doSomeething(5);
وهو لصناعة السيارات في الملاكمة.
Integer getSomething();
...
int i = getSomething();
وهو لصناعة السيارات في علبته.
وقدم Autoboxing في جاوة 5 لمنع رمز مثل:
map.put("ABC", new Integer(5));
map.put("DEF", new Integer(6));
ويمكنك أن تقول الآن:
map.put("ABC", 5);
وبينما من الأسهل - لديها عدد قليل من المزالق إذا لم تكن متأكدا تماما من ما تقومون به
والملاكمة والتفاف قيمة داخل حاوية، مثل قيمة بدائية كثافة العمليات داخل كائن صحيح
والصب هو كيف أن ننظر إلى نوع.
وفالأول ينتج نوع آخر من القيمة، ويعدل في وقت لاحق فقط كيفية التعامل مع قيمة موجودة بالفعل
وباستثناء الصب بين أنواع بدائية يعدل فعلا تمثيلها. (وهذا لا يجعلها أكثر وضوحا أليس كذلك؟)
يعد Boxing and unboxing نوعًا من أنواع التمثيل في Java، حيث يمكنك الإرسال من فئة بدائية إلى فئة الغلاف الخاصة بها أو العكس، على سبيل المثال.منطقية إلى منطقية (مربع)، أو منطقية إلى منطقية (unbox).
أنواع القوالب في جافا، مع مثال:
تحويل الهوية (الفقرة 1.1.5) سلسلة إلى سلسلة
تحويل بدائي متسع (الفقرة 2.1.5) بايت إلى int
تضييق التحويل البدائي (الفقرة 3.1.5) int إلى بايت
تحويل مرجعي موسع (الفقرة 5.1.5) عدد صحيح إلى رقم
تحويل مرجعي ضيق (الفقرة 6.1.5) عدد إلى عدد صحيح
تحويل الملاكمة (§5.1.7) int إلى عدد صحيح
تحويل فتح علبة (الفقرة 5.1.8).عدد صحيح إلى كثافة العمليات
يحدث Autoboxing أو autounboxing عندما يقوم المترجم بإجراء تحويل boxing/unboxing نيابةً عنك (لا يظهر بشكل صريح في الكود المصدري كتعبير مصبوب)، على سبيل المثال.راجع السؤال الذي أشرت إليه.
هل Autoboxing وأونبوإكسينغ يمكن تطبيقها في حالة التالية؟
Long one = 10;
long two = 15;
Long three = 20;
if(one == three) //will this be unboxed or do we need to put a explicit
//condition like if(one.intValue() == three.intValue())
System.out.println("Equal");
else
System.out.println("Not Equal");
if(one == two) //will this be unboxed or do we need to put a explicit
//condition like if(one.intValue() == two)
System.out.println("Equal");
else
System.out.println("Not Equal");