ベクター要素を印刷しようとすると、これらの奇妙な文字が表示されます!
-
22-07-2019 - |
質問
Netbeansを使用しています。
以下のプログラムを実行すると、出力[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));
}
}
私もそれを回避しようとしましたが、それから私は
スレッド<!> quot; main <!> quotの例外; 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));
上記は期待どおりに機能します。
つまり、<!> quot; int <!> quot;配列は整数の配列ではなくオブジェクトのように扱われます。言い換えれば、オートボクシングはそれに適用されていないようですか?
他のヒント
[I@de6ced
は、次のように分類できます。
-[
配列
-I
整数
-de6ced
この reference ハッシュコード(Sun Javaでは基本的に参照)
toString()は、ClassName @ HashCodeのようなものを返します。これは、まさに(奇妙な)プリミティブ配列クラスで発生するものです。
問題は、<T> List<T> asList(T...)
メソッドによって間違った型が推測されていることです。 Integer[]
の代わりにint[]
を使用するようにコードを変更します。これは、intがプリミティブであることの結果ですが、int []はオブジェクトです。
これを直接見ることができます:
System.out.println(Arrays.asList(new int[]{5}));
= <!> gt; [[I@
いくつかのリファレンス
System.out.println(Arrays.asList(new Integer[]{5}).get(0));
= <!> gt; 5
私は何が起こっていたかを理解したと思います:
int[] a = new int[1];
a[0] = 5;
これでintの配列ができました。
Vector<Integer> a1 = new Vector(Arrays.asList(a));
問題は、Arrays.asList
を呼び出す方法にあります。
asListの署名は<!> quot; public static <T> List<T> asList(T... a)
<!> quot;です。 T == int
はオブジェクト型ではないため、int
には適用されません。また、配列T == Integer
のベースタイプはa
ではなくInteger
であるため、T
とは一致しません。実際に起こっているのは、int[]
がArrays.aslist(a)
にバインドされており、List<int[]>
がVector
!!!
List
を返していることです。
次に、a1.elementAt(0)
からObject
を作成し、1つの要素(「a」に割り当てられた元のtoString()
)を持つa1
を取得します。
System.out.println(a1.elementAt(0));
最後に、<=>が<=>をフェッチし、最終的に<=>メソッドの<=>実装を呼び出します。
これから学ぶためのいくつかの重要なレッスン:
- 生のタイプと 行で行う一般的な型 <=>を宣言し、
- 無視するか、回すのは悪い考えです コンパイラの一般的な型安全性 警告
intがオートボクシングを使用して整数になっているように見えるため、値ではなくオブジェクト参照を取得しています。正しいtoStringを呼び出して<!> quot; 5 <!> quot;で終わる必要があるため、依然として奇妙に見えます。