2009-08-05 42 views
2

我正在使用Netbeans。 當我運行下面的程序,我得到這個輸出[[email protected]!怎麼來的?當我嘗試打印出一個向量元素時,我會得到這些奇怪的字符!

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被轉換爲java.lang.Integer中 。主要(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); 
} 
+0

您可以使用Arrays.asList的可變參數執行,以避免int數組:Vector a1 = new Vector(Arrays.asList(5)); – KitsuneYMG 2009-08-05 02:19:05

+0

http://stackoverflow.com/questions/1040868/java-syntax-and-meaning-behind-b1ef9157-binary-address – erickson 2009-08-05 02:21:49

回答

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

正如你所期望的上述作品。

所以它看起來像「int」數組被視爲對象而不是整數數組。換句話說,自動裝箱似乎不適用於它?

-1

它看起來像廉政局正在成爲使用自動裝箱所以你得到一個對象引用,而不是值的整數。仍然看起來很奇怪,因爲它應該調用正確的toString並以「5」結尾。

+0

錯誤的答案。 Integer類重寫toString()以爲您提供值的字符串形式。所以你應該看到「5」。 – 2009-08-05 02:25:59

6

[[email protected]可細分爲:
- [陣列
- I整數
的 - de6ced與此參考哈希碼(在的Sun Java,基本上是參考)

toString()for Object返回像ClassName @ HashCode這樣的行爲,這正是您在這裏看到的恰好與(較奇怪的)原始數組類相關的事情。

問題是由<T> List<T> asList(T...)方法推斷錯誤類型。更改您的代碼使用Integer[]而不是int[]。這是int爲原始的結果,但int []是一個對象。

您可以直接看到:

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

=>[[[email protected]一些參考

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

=>5

+0

+1,注意到提供的代碼與報告的行爲不匹配! – 2009-08-05 02:20:08

+0

我確定我沒有遺漏任何東西。這是我編譯該程序時得到的輸出... – user126356 2009-08-05 02:27:29

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不是對象類型。並且它不能與T == Integer匹配,因爲數組a的基類型爲int而不是Integer。實際發生的是Tint[]綁定,而Arrays.aslist(a)正在返回List<int[]>,其中一個元素的值爲a !!!

然後創建從一個ListVector與獲得一個元素Vector ...原來int[]是被分配到「A」。

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

最後,a1.elementAt(0)取的int[],你最終調用Object實施toString()方法。

幾個重要的教訓,從這個學習:

  • 這是一個糟糕的主意,因爲你在聲明a1行 做混合原料的類型和 泛型類型,並
  • 是一個壞主意不理,或將 關閉編譯器的通用型安全 警告
相關問題