请解释这个通用代码通配符编译时错误:
//no compile time error.
List<? extends Number> x = new ArrayList<>();
//compile time error.
List<? extends Number> x = new ArrayList<? extends Number>();
Run Code Online (Sandbox Code Playgroud) 我有这门课
public class Tree<T> {
//List of branches for this tree
private List<Tree<? super T>> branch = new ArrayList<Tree<? super T>>();
public Tree(T t){ this.t = t; }
public void addBranch(Tree< ? super T> src){ branch.add(src); }
public Tree<? extends T> getBranch(int branchNum){
return (Tree<? extends T>) branch.get(branchNum);
}
private T t;
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用此类创建一个变量
public static void main(String[] args){
Tree<? super Number> num2 = new Tree<? super Number>(2);
}
Run Code Online (Sandbox Code Playgroud)
它给了我这个错误
Cannot instantiate the type Tree<? super Number>
Run Code Online (Sandbox Code Playgroud) 我上课了
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通配符实例创建新的通用对象
但是这两个问题都提供了两个选项编译失败的原因.我无法理解为什么以及如何允许最后一个.