相关疑难解决方法(0)

使用通配符创建新的通用对象

请解释这个通用代码通配符编译时错误:

//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)

java generics bounded-wildcard

11
推荐指数
1
解决办法
3260
查看次数

无法实例化泛型中的类型

我有这门课

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)

java generics wildcard bounded-wildcard

6
推荐指数
2
解决办法
6973
查看次数

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

我上课了

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通配符实例创建新的通用对象

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

java generics bounded-wildcard

3
推荐指数
1
解决办法
252
查看次数

标签 统计

bounded-wildcard ×3

generics ×3

java ×3

wildcard ×1