我大大简化了我的问题。这是它的读法。
我正在试图找出以下代码无法编译的原因:
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>() );
答案 0 :(得分:7)
以下编译符合预期:
List<Set<? extends Set<?>>> list = new ArrayList<Set<? extends Set<?>>>();
list.add(new HashSet<Set<String>>());
list.add(new HashSet<Set<Integer>>());
问题是泛型是类型不变的。
考虑一个更简单的例子:
Animal
到Dog
的转换转换(例如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<?>>
。
List<List<? extends Number>>
List<Animal> animals = new ArrayList<Dog>()
? <E extends Number>
and <Number>
? 答案 1 :(得分:1)
它不会编译,因为语句的Pair<,>
中的第二个参数的类型是String
,并且该类型可能不是声明中使用的“未知”类型。我认为如果将?
替换为Object
,它将会编译。当然,您将失去编译时类型检查。