أحصل على هذه الأحرف الغريبة عندما أحاول طباعة عنصر متجه!

StackOverflow https://stackoverflow.com/questions/1230842

  •  22-07-2019
  •  | 
  •  

سؤال

أنا أستخدم نتبيانز.عندما أقوم بتشغيل البرنامج أدناه، أحصل على هذا كإخراج [I@de6ced!كيف ذلك؟

import java.util.Arrays;
import java.util.Vector;

public class Test {

public static void main (String[] args) {
     int[] a = new int[1];
     a[0] = 5;
     Vector<Integer> a1 = new Vector(Arrays.asList(a));
     System.out.println(a1.elementAt(0));
 }
}

لقد حاولت أيضًا حل المشكلة ولكن بعد ذلك حصلت على

استثناء في مؤشر الترابط "الرئيسي" java.lang.ClassCastException:لا يمكن أن أتعامل مع java.lang.integer في topcoder.test.main (test.java:13) Java النتيجة:1

public static void main (String[] args) {
    int[] a = new int[1];
    a[0] = 5;
    Vector<Integer> a1 = new Vector(Arrays.asList(a));

    int b = a1.elementAt(0); /* EXCEPTION THROWN HERE */
    System.out.println(b);
}
هل كانت مفيدة؟

المحلول

Integer[] a = new Integer[1];
a[0] = new Integer(5);
List list = Arrays.asList(a);
System.out.println(list.get(0));

والأعمال المذكورة أعلاه كما كنت تتوقع.

وهكذا يبدو وكأنه يتم التعامل مع "كثافة" مجموعة مثل كائن وليس مجموعة من الأعداد الصحيحة. وبعبارة أخرى لا يبدو السيارات الملاكمة ليتم تطبيقها على ذلك؟

نصائح أخرى

ويمكن تقسيم [I@de6ced على النحو:
 - [ مجموعة من
 - I من الأعداد الصحيحة
 - de6ced مع هذا <الصورة> مرجع تجزئة رمز (الذي، في صن جافا، هو في الأساس المرجعية)

وtoString () للعودة كائن somethine مثل اسم_الفئة @ شفرة التجزئة، وهو بالضبط ما ترونه يحدث هنا فقط مع (بدلا غريب) الطبقات البدائية صفيف.

والمشكلة هي أن نوع الخطأ يتم الاستدلال على ذلك من خلال طريقة <T> List<T> asList(T...). تغيير التعليمات البرمجية لاستخدام Integer[] بدلا من int[]. هذا هو نتيجة لكثافة العمليات كونها بدائية، ولكن كثافة العمليات [] هو كائن.

ويمكنك ان ترى هذا مباشرة:

System.out.println(Arrays.asList(new int[]{5}));

و=> [[I@ <م> بعض المراجع

System.out.println(Arrays.asList(new Integer[]{5}).get(0));

و=> 5

أعتقد أنني فهمت ما كان يحدث:

 int[] a = new int[1];
 a[0] = 5;

لدينا الآن مجموعة من int.

 Vector<Integer> a1 = new Vector(Arrays.asList(a));

المشكلة في الطريقة التي تتصل بها Arrays.asList.

التوقيع الخاص بـ asList هو "public static <T> List<T> asList(T... a)".لا ينطبق مع T == int لأن int ليس نوع الكائن.ولا يمكن أن تتطابق مع T == Integer لأن النوع الأساسي للصفيف a يكون int لا Integer.ما يحدث في الواقع هو ذلك T ملزم ل int[], ، و Arrays.aslist(a) يعود أ List<int[]> بعنصر واحد وهو قيمة a!!!

ثم تقوم بإنشاء Vector من List واحصل على Vector بعنصر واحد..الأصلي int[] الذي تم تعيينه إلى "أ".

 System.out.println(a1.elementAt(0));

أخيراً، a1.elementAt(0) يجلب int[], ، وينتهي بك الأمر بالاتصال بـ Object تنفيذ ل toString() طريقة.

هناك درسان مهمان يجب تعلمهما من هذا:

  • إنها فكرة سيئة أن تخلط بين الأنواع الخام وأنواع عامة كما تفعل على الخط الذي يعلن a1, ، و
  • إنها فكرة سيئة أن تتجاهل ، أو إيقاف تحذيرات السلامة العامة للمترجم

ويبدو أن إدارة النزاهة المؤسسية أصبحت الأعداد الصحيحة باستخدام autoboxing حتى تتمكن من الحصول على مرجع كائن بدلا من القيمة. ما زال يبدو غريبا كما ينبغي استدعاء toString الصحيح وينتهي مع "5".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top