2015-10-05 42 views
-1

考慮此示例:鑄造界通配符無界通配符的通用類型中是錯誤的(X <Y <? extends T>>到X <Y<?>>

private <T> void m(Class<? extends T> k, Set<Class<? extends T>> sk) { 
    Class<?> ku = k; 
    Set<Class<?>> sku = sk; // <-- Type mismatch: cannot convert from 
          //  Set<Class<? extends T>> to Set<Class<?>> 
} 

換句話說,我可以分配一個Class<? extends T>Class<?>爲一些任意T但不是Set<Class<? extends T>>Set<Class<?>>

它可能有事情做與協方差/逆變一定的侷限性,但什麼?

我可以介紹一個演員:Class.class::cast會這樣做。但是有沒有一種方法可以讓編譯器根據我的意願使用精巧的類型-FU而不是用演員們的頭撞到頭部?

+1

[嵌套通配符(http://bayou.io/draft/Capturing_Wildcards.html#Nested_Wildcards) – ZhongYu

+0

@Sotirios - 現在我知道了【答案】(http://stackoverflow.com/a/ 32959018/7515790)我發現它是重複的,但我不知道它,因爲它忽略了任何有關嵌套通配符的東西,所以它不是明顯的匹配,這似乎使它與衆不同。 – davidbak

回答

3

即使一個Class<? extends T>Class<?>,一個Set<Class<? extends T>>不是Set<Class<?>>,對於即使DogAnimal同樣的道理,一個List<Dog>不是List<Animal>。這裏,? extends TDog具有相同的作用,並且?Animal具有相同的作用。

您需要在Class之前的? extends才能正確編譯。

Set<? extends Class<?>> sku = sk;