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>>());