<?>
和<E>
都是未知類型;但是所有的List<?>
s都有的一些類型的元素,所以您可以調用參數爲List<E>
的方法,因爲存在一些與其匹配的未知類型。
注意,你不能做到這一點:
public static void swap(Object object, List<?> list) {
swapHelper(object, list); // Compiler error: object not in bounds of list.
}
private static <E> void swapHelper(E object, List<E> list) {
swap(object, list); // OK.
}
,因爲你現在不知道,如果Object
是List<?>
的範圍內。
你也不能添加新的非空值的列表:
private static <E> void swapHelper(List<E> list) {
list.add(new E()); // Can't create an instance of type variable.
swap(list);
}
,但你可以添加你從列表中取值,因爲它們是已知的列表的範圍內:
private static <E> void swapHelper(List<E> list) {
list.add(list.get(0));
swap(list);
}
所以它是類型安全的做調用從swap
原swapHelper
,因爲你不能使東西是不強制轉換爲E
(不管這類型)到列表中。
- 如果分配
tW = tE
,你不能添加任何其他tW
比null
,所以你不能把tE
的狀態下,它含有比實例以外的任何其他: 與tW
和tE
同樣的E
。
- 如果你被允許指定
tE = tW
,你可以添加的E
非空實例tE
。這可能意味着您可以將錯誤類的實例添加到tW
,這可能會導致運行時類型錯誤。因此,這項任務是被禁止的。
請記住,分配列表不會導致要複製的列表:如果您分配tE = tW
,然後tE == tW
,所以適用於所有tE
的變化中也可以看到通過tW
,因爲它們是同一個實例。
downvoter:照顧解釋? –