我一直在努力正確理解Java泛型。因此,在這個追求中,我已經體會到一個原則「廣告中的真理原理」,我用簡單的語言來理解這一點。瞭解廣告中的真理原理Java泛型
廣告中的真理原則:數組的實體類型必須是其子類型的子類型 。
我已經編寫了示例代碼.java和.class文件,如下所示。請仔細閱讀代碼並解釋代碼中哪部分指明/指示了上述語句的哪一部分。
我寫了評論,我認爲我不應該在這裏寫代碼的描述。
public class ClassA {
//when used this method throws exception
//java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
public static <T> T[] toArray(Collection<T> collection) {
//Array created here is of Object type
T[] array = (T[]) new Object[collection.size()];
int i = 0;
for (T item : collection) {
array[i++] = item;
}
return array;
}
//Working fine , no exception
public static <T> T[] toArray(Collection<T> collection, T[] array) {
if (array.length < collection.size()) {
//Array created here is of correct intended type and not actually Object type
//So I think , it inidicates "the reified type of an array" as type here lets say String[]
// is subtype of Object[](the erasure), so actually no problem
array = (T[]) Array.newInstance(array.getClass().getComponentType(), collection.size());
}
int i = 0;
for (T item : collection) {
array[i++] = item;
}
return array;
}
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "B");
String[] strings = toArray(list);
// String[] strings = toArray(list,new String[]{});
System.out.println(strings);
}
}
請嘗試用簡單的語言解釋。請指出我錯在哪裏。更正意見的代碼更多讚賞。
謝謝你的這一切
問題是一個字符串是一個對象,但一個對象並不總是一個字符串(除了基本類型以外的所有東西都是一個對象),所以對象數組不能轉換爲字符串數組 –
一種解決方案是使用https: //docs.oracle.com/javase/8/docs/api/java/util/Collection.html#toArray-T:A- –