我有一個類MyStack<T>
它定義了以下泛型類型及的toArrayMethod
public T[] toArray(){
int s=size();
@SuppressWarnings("unchecked")
T[] result=(T[])new Object[s];
Node n=first;
for (int i=0; i<s; i++){
result[i]=n.data;
n=n.next;
}
return result;
}
因爲這將返回T
類型的數組,我會想,如果我宣佈這個例子:MyStack<String> s=new MyStack<>
,那下面會完全有效:String[] test=s.toArray()
。我認爲這是因爲s
是String
的類型,toArray
應該返回一個String
類型的數組,因爲String
已經基本上被這個類中的每個T
代替(僅用於這個特定的實例,我知道)。這樣運行沒有錯誤的唯一方法是,如果我這樣做:Object[] test=s.toArray()
。
這是爲什麼?
'因爲擦除'實際上並不回答這裏的問題。它只能解釋爲什麼這個例外是從一個奇怪的地方拋出的。 – Radiodef 2014-11-04 19:41:47
我想我有點困惑。如果我們能做的最好的就是說's'是一個堆滿了'Objects'的堆棧,所有其他的類都是從這個堆棧中下來的,爲什麼還要使用泛型呢?我在這裏錯過了什麼? – user50210 2014-11-05 05:22:33
@ user50210問題是,您正試圖將'Object []'強制轉換爲'String []'並且它不是一個有效的強制轉換。 – Radiodef 2014-11-05 16:48:34