[英]list.toArray() agrees to transfer items of type A to an array of type B[]
我有以下代碼:
private double doThings(List<ClassA> list){
ClassB[] array = list.toArray(new ClassB[0]);
// ...
}
這編譯。 為什么?
基於javadoc :
ArrayStoreException
- 如果指定數組的運行時類型不是此列表中每個元素的運行時類型的超類型。
java.util.List源代碼很有意思:
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/List.java
該類是通用的類型:
public interface List<E> extends Collection<E>
但是,toArray方法由不同類型參數化:
<T> T[] toArray(T[] a);
這是一種使用不同類型作為參數而不是類本身的通用方法。 T和E之間沒有任何聯系。這就是為什么你可以在toArray方法中使用不同類型的參數而不是用於參數化列表的類。
找到這種設計背后的原因會很有趣。 初看起來,有點奇怪。
沒有辦法聲明該方法可以防止ArrayStoreException
的可能性。 即使聲明方法具有參數類型A[]
,您仍然可以向其傳遞一個運行時類型為SubClassOfA[]
的數組,如果該列表具有A
對象,則它將導致ArrayStoreException
因為它們不能存儲在SubClassOfA[]
。
由於沒有辦法避免它,並且它依賴於程序員正確使用它,它們也可以使方法盡可能通用,並采用任何類型的數組。 正確使用時(即當我們知道所有對象也是B
實例時),它不會導致ArrayStoreException
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.