我相信,泛型中的?
类型是特定的未知类型。这意味着,声明让我们说这种类型的列表将阻止我们添加任何类型的对象。(?)通配符泛型的不规则性
List<?> unknownList;
unknownList.add(new Object()); // This is an error.
编译器按预期给出错误。
但是,当未知类型是二级泛型时,编译器似乎并不在意。
class First<T> {}
List<First<?>> firstUnknownList;
// All these three work fine for some reason.
firstUnknownList.add(new First<>());
firstUnknownList.add(new First<Integer>());
firstUnknownList.add(new First<String>());
我想可能是编译器不关心第二级在所有通用的参数,但它并非如此,
List<First<Integer>> firstIntegerList;
firstIntegerList.add(new First<String>()); // This gives a compiler error as expected.
那么,为什么编译器还允许我们加入任何一种当第二个例子中只有一个未知元素(因此什么也没有)是可以接受的元素?
注:编译器的Java 1.8
在'List>'中添加了一个'新的第一个()',那么你能做什么是不安全的?假设你在'First '上有一个生产者''和一个消费者'':你不能调用消费者;你可以从制作人那里得到一个“Object”。因此,没有什么不安全的 - 除非我错过了一个明显的例子。 –
“,因此除了'null'外没有任何东西。 –
'List >'本来可以被分配一个'List',然后添加一个Object *是错误的。 '列表