2

私はネットビーンズを使用しています。以下のプログラムを実行すると、これが出力として得られます[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: [TopCoder.Test.main(Test.java:13) で java.lang.Integer にキャストできません Java Result: 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);
}
4

4 に答える 4

6

[I@de6ced次のように分解できます:
-[配列
-I整数
-de6cedこの参照ハッシュコード (Sun Java では基本的にこれが参照)

Object の toString() は、ClassName@HashCode のようなものを返します。これは、ここで (やや奇妙な) プリミティブ配列クラスで発生していることとまったく同じです。

問題は、メソッドによって間違った型が推論されている<T> List<T> asList(T...)ことです。Integer[]の代わりに使用するようにコードを変更してくださいint[]。これは int がプリミティブであることの結果ですが、int[] はオブジェクトです。

これを直接見ることができます:

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

=>[[I@参考程度

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

=>5

于 2009-08-05T02:16:43.007 に答える
2
Integer[] a = new Integer[1];
a[0] = new Integer(5);
List list = Arrays.asList(a);
System.out.println(list.get(0));

上記は期待どおりに機能します。

したがって、「int」配列は整数の配列ではなくオブジェクトのように扱われるようです。つまり、オートボクシングが適用されていないようですか?

于 2009-08-05T02:29:46.890 に答える
0

私は何が起こっているのかを理解したと思います:

 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と一致できません。実際に起こっているのは、にバインドされており、 !!!の値である 1 つの要素を持つ を返していることです。T == IntegeraintIntegerTint[]Arrays.aslist(a)List<int[]>a

次に、Vectorからを作成し、1 つの要素を持つListを取得します ... 'a' に割り当てられVectorたオリジナル。int[]

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

最後に、a1.elementAt(0)をフェッチし、メソッドの実装をint[]呼び出すことになります。ObjecttoString()

これから学ぶべきいくつかの重要な教訓:

  • a1を宣言する行で行うように、生の型とジェネリック型を混在させるのは悪い考えです。
  • コンパイラの一般的なタイプ セーフ警告を無視したりオフにしたりするのは悪い考えです。
于 2009-08-05T03:52:40.023 に答える
-1

オートボクシングを使用してintが整数になっているように見えるため、値の代わりにオブジェクト参照を取得しています。正しい toString を呼び出して「5」になるはずなので、まだ奇妙に思えます。

于 2009-08-05T02:14:54.647 に答える