通用抽象类构造函数

时间:2015-09-21 19:42:50

标签: java generics constructor abstract

我试图在所述类的方法中调用通用抽象类的构造函数。下面的代码显示了这一点:

public abstract class Node<T> {
    public Collection <Node<T>> pars;   
    public Collection<Node<T>> interactors;
    private boolean target = false;
    private boolean multiple = false;
    private T value;

    //constructor for a simple node
    public Node(T val){
        this.value = val;
    }

    //constructor for a multiple interaction node
    public Node(Collection<Node<T>> inter, T val){
        this.interactors = inter;
        this.value = val;
        if (inter.size()>0){
            this.multiple = true;
        }
    }

    public void find_inters(){
        ArrayList<Collection<T>> multi_interactions = search();
        for (int i = 0; i < multi_interactions.size(); i++){
            Node<T> a = new Node<T>(multi_interactions.get(i), this.value);    <----i get compile error here
        }
    }
}

但我一直收到错误,我无法实例化类型Node。我想在函数find_inters()中创建一个新的Node对象,但我不能。有谁知道为什么/可能的解决方案?

2 个答案:

答案 0 :(得分:0)

您已经说Node是抽象的,因为您还没有实现某些方法,但问题是您希望Node<T> a成为Node个对象,但是当你调用这些方法时,你必须决定a实际做什么

你可以拥有没有实现所有方法的类 - 这就是abstract类的工作方式 - 但你不能拥有对象而没有全部实现的方法,因为该对象可以调用该方法,并且您的程序需要知道该怎么做。

您可以做的是写Node<T> a = new MySubNode<T>(...),其中MySubNodeNode的子类,并且填写了所有方法。或者您可以编写Node<T> a = new Node<T>(...) { implementations of methods go here },这基本上是__construct同样的事情,除了实现是在一个匿名类。但是你无法实例化一个抽象类。

答案 1 :(得分:0)

只是为了回答路易斯的答案。如果search()是抽象的,您可以将其更改为返回ArrayList<Node<T>>,因此实现类可以执行类似Node<T> a = new MySubNode<T>(...)的操作(除非在需要ArrayList<Collection<T>>的其他地方使用search() )。