类中的构造函数不能应用于给定类型 - 抽象类

时间:2016-06-11 16:49:36

标签: java constructor abstract-class super

我知道在这里和那里已经回答了名义上的问题,但是每一个答案仍然无法解决我的问题。问题是:

我有一个抽象类,它是Node,包含这样的构造函数:

public Node(List<Record> dataSet, int labelIndex) {
    this.allSamples = new ArrayList<Integer>();
    this.dataSet = dataSet;
    this.classificationLabelIndex = labelIndex;
    this.entropy = 0;
}

然后,我将absract类扩展到TreeNode,包含这样的构造函数(使用super):

public TreeNode(List<Record> dataSet, int labelIndex, List<Attribute> attributes, int level, double threshhold) {
    super(dataSet, labelIndex);
    this.attributes = attributes;
    splittedAttrs = new HashSet<Integer>();
    this.level = level;
    this.displayPrefix = "";
    this.children = null;
    this.threshhold = threshhold;
}

因此,TreeNode类扩展抽象Node类并使用super方法从Node类调用dataset和labelindex,但后来我得到警告&#34;类Node中的构造函数Node不能应用于给定类型,不需要参数。 &#34;也许是因为我在TreeNode中添加了一些参数,但我仍然认为它不太可能。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

如果没有看到更多细节,很难知道问题所在。不,你不能直接实例化一个抽象类,但是你可以在一个抽象类的子类的构造函数中调用super,所以你所做的似乎没什么问题。一个想法是确保与另一个名为Node或TreeNode的类没有任何冲突的类路径问题。实际上,如果您已导入这些自定义类,则可以创建类路径中可能已存在的自定义类,例如: https://docs.oracle.com/javase/7/docs/api/javax/swing/tree/TreeNode.html https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html

尝试将它们重命名为更具体的内容,例如MyTreeNode和MyNode等等。

无论如何,我尽可能地使用您发送的代码进行复制,并且没有看到任何问题(即我的类路径中没有与其他导入冲突)。检查一下,看看它是否与你的相符。如果没有,请复制/粘贴错误的堆栈跟踪以及所有代码。感谢

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

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

public abstract class Node {

private List<Integer> allSamples;
private List<Record> dataSet;
private int classificationLabelIndex;
private int entropy;

public Node(List<Record> dataSet, int labelIndex) {
    this.allSamples = new ArrayList<Integer>();
    this.dataSet = dataSet;
    this.classificationLabelIndex = labelIndex;
    this.entropy = 0;
}

}

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class TreeNode extends Node {

private List<Attribute> attributes;
private Set<Integer> splittedAttrs;
private int level;
private String displayPrefix;
private Object children;
private double threshhold;

public TreeNode(List<Record> dataSet, int labelIndex,
        List<Attribute> attributes, int level, double threshhold) {
    super(dataSet, labelIndex);
    this.attributes = attributes;
    splittedAttrs = new HashSet<Integer>();
    this.level = level;
    this.displayPrefix = "";
    this.children = null;
    this.threshhold = threshhold;
}

public static void main(String[] args) {
    Node node = new TreeNode(new ArrayList<Record>(), 1,
            new ArrayList<Attribute>(), 1, 1.1);

}

}

class Record {}
class Attribute {}