Java 为我提供了<? extends class>
一种过滤 java 类的方法,您可以使用它
在本例中构建新的 HashMap,例如:
我可以这样做:
Map<String,? extends Serializable> map1 = new HashMap<String,String>();
这是正确的,因为 String 实现了 Serialized,所以编译器让我这样做。
但是当我尝试这样做时:
Map<String,GenericClass<? extends Serializable>> map2 = new HashMap<String, GenericClass<String>>();
作为 GenericClass 因为它:
public class GenericClass<T>
{
.
.
.
}
编译器抛出一个错误:
Type mismatch: cannot convert from HashMap<String,GenericClass<String>> to Map<String,GenericClass<? extends Serializable>>
我想知道,这是怎么回事?
也许编译器无法检测到扩展类是泛型类型的一部分。
您需要使用以下内容:
Map<String, ? extends GenericClass<? extends Serializable>> map2 =
new HashMap<String, GenericClass<String>>();
嵌套通配符与顶级通配符有很大不同 - 只有后者执行通配符捕获 http://docs.oracle.com/javase/tutorial/java/generics/capture.html。因此,HashMap<String, GenericClass<String>>
被认为不可转换为Map<String, GenericClass<? extends Serializable>>
, 因为GenericClass<? extends Serializable>
是一个具体类型参数(并且因为泛型不是协变的 https://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-arent-javas-generics-implicitly-p).
有关嵌套通配符的更多信息,请参阅此文章:泛型方法上的多个通配符使 Java 编译器(和我!)非常困惑 https://stackoverflow.com/questions/3546745/multiple-wildcards-on-a-generic-methods-makes-java-compiler-and-me-very-confu/3547372#3547372
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)