ベクター要素を印刷しようとすると、これらの奇妙な文字が表示されます!

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

  •  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では基本的に参照)

Objectの

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 !!!

の値である1つの要素を持つListを返していることです。

次に、a1.elementAt(0)からObjectを作成し、1つの要素(「a」に割り当てられた元のtoString())を持つa1を取得します。

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

最後に、<=>が<=>をフェッチし、最終的に<=>メソッドの<=>実装を呼び出します。

これから学ぶためのいくつかの重要なレッスン:

  • 生のタイプと 行で行う一般的な型 <=>を宣言し、
  • 無視するか、回すのは悪い考えです コンパイラの一般的な型安全性 警告

intがオートボクシングを使用して整数になっているように見えるため、値ではなくオブジェクト参照を取得しています。正しいtoStringを呼び出して<!> quot; 5 <!> quot;で終わる必要があるため、依然として奇妙に見えます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top