【问题标题】:Cannot Instantiate Type in generics无法在泛型中实例化类型
【发布时间】:2012-08-30 15:14:45
【问题描述】:

我有这门课

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;

}

我正在尝试使用这个从这个类中创建一个变量

public static void main(String[] args){ 
        Tree<? super Number> num2 = new Tree<? super Number>(2);
    }

它给了我这个错误

Cannot instantiate the type Tree<? super Number>

【问题讨论】:

标签: java generics wildcard bounded-wildcard


【解决方案1】:

创建新实例时不能使用通配符?。您应该将代码更改为类似的内容

import java.util.ArrayList;
import java.util.List;

public class Test1 {
  public static void main(String[] args){
    Tree<? super Number> num2 = new Tree<Number>(2);
    num2.addBranch(new Tree<Number>(1));
    Tree<? super Number> num3 = (Tree<? super Number>) num2.getBranch(0);
    System.out.println(num3);
  }
}

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<Number> src){ branch.add((Tree<? super T>) src); }
  public Tree<? extends T> getBranch(int branchNum){
    return (Tree<? extends T>) branch.get(branchNum);
  }

  public String toString(){
    return String.valueOf(t);
  }

  private T t;

}

【讨论】:

    【解决方案2】:

    而实例化的泛型应该替换为对应的对象。

    例如:

     Tree<Integer> num2 = new Tree<Integer>(2);
    

    【讨论】:

    • 如果我想添加数字树的子类型怎么办?可能像 Tree
    • 确切地说,你需要在实例化时明确告诉你要添加到 Tree 的类型。树类被定义为 Generic,以便在实例化时您可以知道具体类型。
    • 我的目标是树将包含 Number 的各种子类。比如 Tree,Tree 等等。
    • 然后使用Tree&lt;Number&gt;实例化它。
    • @ErickRobertson:是的,完全正确,使用 Number 和 se.e 进行验证
    猜你喜欢
    • 1970-01-01
    • 2013-10-03
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多