Java 多个嵌套通配符-参数不适用
我已经大大简化了我的问题。下面是它的内容 我正试图找出以下代码无法编译的原因:Java 多个嵌套通配符-参数不适用,java,generics,wildcard,compiler-errors,Java,Generics,Wildcard,Compiler Errors,我已经大大简化了我的问题。下面是它的内容 我正试图找出以下代码无法编译的原因: List<AnonType<AnonType<?>>> l = new ArrayList<AnonType<AnonType<?>>>(); l.add( new AnonType<AnonType<String>>() ); 列表>>(); l、 添加(新的AnonType()); 在哪里 公共类AnonTyp
List<AnonType<AnonType<?>>> l = new ArrayList<AnonType<AnonType<?>>>();
l.add( new AnonType<AnonType<String>>() );
列表>>();
l、 添加(新的AnonType());
在哪里
公共类AnonType{
Tα;
名单b;
}
编译器错误是add不适用于给定的参数。OTOH,以下代码仅包含1级嵌套通配符,可完美编译:
List<AnonType<?>> l = new ArrayList<AnonType<?>>();
l.add( new AnonType<String>() );
List>();
l、 添加(新的AnonType());
它不会编译,因为语句的对中的第二个参数的类型是字符串
,并且该类型可能不是声明中使用的“未知”类型。我认为如果您将?
替换为对象
,它将编译。当然,您将丢失编译时类型检查。以下内容将按预期编译:
List<Set<? extends Set<?>>> list = new ArrayList<Set<? extends Set<?>>>();
list.add(new HashSet<Set<String>>());
list.add(new HashSet<Set<Integer>>());
列表>>();
添加(新的HashSet());
添加(新的HashSet());
问题是泛型是类型不变的
考虑一个更简单的例子:
- 假设有一个从
动物
到狗
(例如狗扩展动物
)的施法转换。。。
列表
另见
-
- ||
-
这肯定是半打其他问题的重复。谢谢你,Polygene。我刚才在读你对你指出的重复问题的回答。@andigenu:是的,这里有更多的解释,还有其他一些相关的问题,但我想我还是应该在这里回答,以便更直接地回答这个问题。我很感激!在完成当前任务后,我还将关注一些链接,因为我希望更好地掌握泛型(这可能很棘手)。
List<Set<? extends Set<?>>> list = new ArrayList<Set<? extends Set<?>>>();
list.add(new HashSet<Set<String>>());
list.add(new HashSet<Set<Integer>>());