多个嵌套通配符 - 参数不适用

时间:2010-09-06 15:49:30

标签: java generics wildcard compiler-errors

我大大简化了我的问题。这是它的读法。

我正在试图找出以下代码无法编译的原因:

 List<AnonType<AnonType<?>>> l = new ArrayList<AnonType<AnonType<?>>>();
 l.add( new AnonType<AnonType<String>>() );

,其中

public class AnonType<T> {
  T a;

  List<T> b;
}

编译器错误表示add不适用于给定的参数。 OTOH,以下代码只有1级嵌套通配符完美编译:

List<AnonType<?>> l = new ArrayList<AnonType<?>>();
l.add( new AnonType<String>() );

2 个答案:

答案 0 :(得分:7)

以下编译符合预期:

    List<Set<? extends Set<?>>> list = new ArrayList<Set<? extends Set<?>>>();
    list.add(new HashSet<Set<String>>());
    list.add(new HashSet<Set<Integer>>());

问题是泛型是类型不变的。

考虑一个更简单的例子:

  • 鉴于存在从AnimalDog的转换转换(例如Dog extends Animal)...
    • List<Animal> a List<Dog>
  • 有从List<? extends Animal>List<Dog>
  • 的捕获转换

现在,这是在这种情况下发生的事情:

  • 鉴于存在从Set<?>Set<String>的捕获转换...
    • Set<Set<?>> a Set<Set<String>>
  • Set<? extends Set<?>>Set<Set<String>>
  • 进行了捕获转换

因此,如果您想要List<T>,可以添加Set<Set<String>>Set<Set<Integer>>等,那么T NOT {{1 },而是Set<Set<?>>

相关问题

另见

答案 1 :(得分:1)

它不会编译,因为语句的Pair<,>中的第二个参数的类型是String,并且该类型可能不是声明中使用的“未知”类型。我认为如果将?替换为Object,它将会编译。当然,您将失去编译时类型检查。