【问题标题】:generic abstract class constructor通用抽象类构造函数
【发布时间】:2015-09-21 19:42:50
【问题描述】:

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

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
        }
    }
}

但我不断收到无法实例化类型节点的错误。我想在函数 find_inters() 中创建一个新的 Node 对象,但我不能。有人知道原因/可能的解决方案吗?

【问题讨论】:

  • 如果需要实例化类型,为什么要设置abstract?
  • 简单,因为还有其他方法我还不能实现,所以我必须将它们抽象化。删除抽象会允许我实例化一个节点吗? (因为我总能找到抽象方法的解决方法)
  • 是的,但是你不能有未实现的方法。
  • 我明白了,还有其他方法可以让我有一个未实现的方法吗?我可以在方法体中写一些垃圾代码,稍后再实现,但我想要一个更好的解决方案

标签: java generics constructor abstract


【解决方案1】:

您说过Node 是抽象的,因为您还不能实现某些方法,但问题是您希望Node&lt;T&gt; a 成为Node 对象,但您必须决定@ 是什么当您调用这些方法时,987654324@实际上会。

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

你可以写Node&lt;T&gt; a = new MySubNode&lt;T&gt;(...),其中MySubNode是Node的子类,里面填满了所有的方法。或者你可以写Node&lt;T&gt; a = new Node&lt;T&gt;(...) { implementations of methods go here },本质上是一样的,只是实现是在一个匿名类中。但是你不能实例化一个抽象类。

【讨论】:

  • 我明白了,这很有意义。但是我说抽象类的好处主要是写抽象方法(或者不写)对吗?
  • 抽象类的重点是要有非抽象的子类来实际填充这些方法,并且在大多数情况下,会有多个子类以不同的方式填充这些方法。抽象类中可能实现了一些通用的功能,或者只需要填充几个部分的骨架实现,但是没有非抽象实现的抽象类是没有用的。
【解决方案2】:

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

【讨论】:

  • "Just to add to Louis's answer" 表示这应该是对 Louis 的回答的评论,而不是它自己的回答。
  • 是的,应该是,但我还没有足够的声誉来发表评论(除了我自己的答案),路易斯的答案是在我写自己的时候。
猜你喜欢
  • 2015-10-25
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2015-03-20
  • 2011-03-16
  • 1970-01-01
相关资源
最近更新 更多