使用通配符实例化通用对象

arc*_*arc 3 java generics bounded-wildcard

我上课了

public class OrderedBox<T> {}    
Run Code Online (Sandbox Code Playgroud)


编译器不允许像这样创建成员/局部变量.

OrderedBox<? extends T> testItems1 = new OrderedBox<? extends T>();
List<? extends T> testItems2 = new ArrayList<? extends T>();
Run Code Online (Sandbox Code Playgroud)

它在运行时是可以理解的原因,它不能保证对象的类型(由T限制的上限)将被插入并且将违反类型安全.

但它允许创建像这样的成员/局部变量.为什么以及如何允许这个?

private List<OrderedBox<? extends T>> testItems = new ArrayList<OrderedBox<? extends T>>();
Run Code Online (Sandbox Code Playgroud)



注意:我在浏览http://www.onjava.com/pub/a/onjava/excerpt/javaian5_chap04/index1.html时有这个疑问

可能重复:
使用通配符 Generics通配符实例创建新的通用对象

但是这两个问题都提供了两个选项编译失败的原因.我无法理解为什么以及如何允许最后一个.

Sim*_*mon 5

一线变化的答案实际上是在您发布的第二个SO问题中解释的:泛型通配符实例化

One-liner确实声明了一种类型,OrderedBox但没有创建它的实例.

private List<OrderedBox<? extends T>> testItems = new ArrayList<OrderedBox<? extends T>>();
Run Code Online (Sandbox Code Playgroud)

这表示你将拥有一个OrderedBox,但它没有说明哪一个.尝试创建像这样的实例时会遇到麻烦

testItems.add(new OrderedBox<? extends T>())
Run Code Online (Sandbox Code Playgroud)

因为在那个时候,你将修复类型.