簡體   English   中英

Java泛型:列表 <Container<?> &gt; = new LinkedList <Container<Double> &gt;()被禁止?

[英]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頁的某個地方)。

非常感謝您的回答。 我在常見問題解答中找到了一個解釋,經過一番眯着眼睛看,我覺得我明白了。

http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeArguments.html#What%20do%20multilevel%20wildcards%20mean

考慮如果可能會發生什么。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM