【发布时间】:2016-10-18 17:39:30
【问题描述】:
我有课
public class OrderedBox<T> {}
编译器不允许创建这样的成员/局部变量。
OrderedBox<? extends T> testItems1 = new OrderedBox<? extends T>();
List<? extends T> testItems2 = new ArrayList<? extends T>();
它在运行时是可以理解的原因,它不保证将插入对象的类型(以 T 为上限)并且会违反类型安全。
但它允许创建像这样的成员/局部变量。 为什么以及如何允许这样做?
private List<OrderedBox<? extends T>> testItems = new ArrayList<OrderedBox<? extends T>>();
笔记:
我在浏览http://www.onjava.com/pub/a/onjava/excerpt/javaian5_chap04/index1.html时有这个疑问
可能重复:
Creating new generic object with wildcard
Generics wildcard instantiation
但这两个问题都提供了 2 个选项编译失败的原因。 我不明白为什么以及如何允许最后一个 1。
【问题讨论】:
-
两个问题:您运行的是什么版本的 Java,为什么不使用可以解决此问题的菱形
<>运算符? -
您提到的链接“使用通配符创建新的通用对象”上的第一个答案解释了您第一次被禁止的原因(因为您没有说明将创建什么类 testItems1 对象)以及为什么您被允许第二次(因为你告诉列表应该是 OrderedBox 类型)
-
@Makoto,第一名:Java7。第二:谢谢, 解决了。但我的问题是为什么它可以解决它?
-
@NareshJoshi 但未指定 OrderedBox 的类型推断
-
是的,但是对于创建列表对象,您不需要它,对于创建列表对象,您只需要要存储在 OrderedBox 列表中的对象类型,但同样的情况是不适用于您的第一个场景。
标签: java generics bounded-wildcard