[英]Java Generics, must a Class using Generics always be a Container of some type?
[英]Java generics: List<Container<?>> = new LinkedList<Container<Double>>() is prohibited?
為什么用Java,我可以寫
List<?> list = new LinkedList<Double>();
但不是
List<Container<?>> list = new LinkedList<Container<Double>>();
容器就是這樣的東西
public class Container<T> { ... }
這是因為我有一個接受List<Container<?>>
,我想使用Arrays.asList將參數傳遞給它:
process(Arrays.asList(new Container<Double>(), new Container<Double>()));
但是語言不允許這樣,因為它將Arrays.asList
的類型推斷為List<Container<Double>>
,並且不能分配給List<Container<?>>
。
如果我將一個String參數化的容器添加到調用中,
process(Arrays.asList(new Container<Double>(), new Container<String>()));
它仍然不起作用,因為它推斷出類型List<Container<? extends Serializable & Comparable<?>>>
為Arrays.asList List<Container<? extends Serializable & Comparable<?>>>
。 只有當我傳入既不可比較也不可序列化的東西時,它才能正常工作。
當然,我可以進行演員表並讓編譯器閉嘴,但我想知道我在這里做錯了什么。
每個參數化必須是通配符:
List<? extends Container<?>> list = new LinkedList<Container<Double>>();
編輯:我正在通過Angelika Langer的常見問題解答進行解釋,但沒有找到一個(它可能在那里,但隱藏在500頁的某個地方)。
考慮這一點的方法是每個參數化都是獨立的,除非您明確說明,否則編譯器不會推斷出有關參數化的信息。
編輯:我正在通過Angelika Langer的常見問題解答進行解釋,但沒有找到一個(它可能在那里,但隱藏在500頁的某個地方)。
非常感謝您的回答。 我在常見問題解答中找到了一個解釋,經過一番眯着眼睛看,我覺得我明白了。
考慮如果可能會發生什么。
List<Container<Double>> list1 = new LinkedList<Container<Double>>();
List<Container<?>> list2 = list1; // this shouldn't be allowed, because of the below
Container<String> foo = new Container<String>();
foo.add("hi");
list2.add(foo); // legal, because Container<String> is a subtype of Container<?>
Container<Double> bar = list1.get(0);
Double x = bar.get(0); // type error; it is actually a String object
// this indicates that type safety was violated
但是,使用List<? extends Container<?>>
List<? extends Container<?>>
沒有這個問題,因為你不能把任何東西(除了null
)放到這個類型的列表中(因為沒有類型可以保證是“ ? extends Container<?>
”的子類型) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.