Java 错误:未为默认构造函数定义隐式超级构造函数

2022-08-31 10:42:23

我有一些简单的Java代码,其结构与此类似:

abstract public class BaseClass {
    String someString;
    public BaseClass(String someString) {
        this.someString = someString;
    }
    abstract public String getName();
}

public class ACSubClass extends BaseClass {
    public ASubClass(String someString) {
        super(someString);
    }
    public String getName() {
        return "name value for ASubClass";
    }
}

我将有相当多的子类,每个子类都以自己的方式实现方法(模板方法模式)。BaseClassgetName()

这很有效,但我不喜欢在子类中使用冗余构造函数。打字更多,维护起来也难。如果我要更改构造函数的方法签名,则必须更改所有子类。BaseClass

当我从子类中删除构造函数时,我得到这个编译时错误:

Implicit super constructor BaseClass() is undefined for default constructor. Must define an explicit constructor

我想要做的事情是可能的吗?


答案 1

您会收到此错误,因为没有构造函数的类具有默认构造函数,该构造函数是无参数的,等效于以下代码:

public ACSubClass() {
    super();
}

但是,由于您的 BaseClass 声明了一个构造函数(因此没有编译器本来会提供的默认无参数构造函数),这是非法的 - 扩展 BaseClass 的类不能调用,因为 BaseClass 中没有无参数构造函数。super();

这可能有点违反直觉,因为您可能会认为子类自动具有基类具有的任何构造函数。

解决此问题的最简单方法是基类不声明构造函数(因此具有默认的no-arg构造函数)或具有声明的no-arg构造函数(单独或与任何其他构造函数一起)。但通常这种方法无法应用 - 因为您需要将任何参数传递到构造函数中以构造类的合法实例。


答案 2

对于那些谷歌这个错误并到达这里的人:可能有另一个原因收到它。Eclipse 会在您进行项目设置时给出此错误 - 系统配置不匹配。

例如,如果您将 Java 1.7 项目导入 Eclipse,但未正确设置 1.7,那么您将收到此错误。然后,您可以转到 和 ;或转到并添加/修复您的 JRE 1.7 安装。Project - Preference - Java - Compilerswitch to 1.6 or earlierWindow - Preferences - Java - Installed JREs


推荐