【问题标题】:Java error: Implicit super constructor is undefined. Must explicitly invoke another constructor [duplicate]Java 错误:隐式超级构造函数未定义。必须显式调用另一个构造函数[重复]
【发布时间】:2014-10-02 07:01:36
【问题描述】:

我在外部 jar 中有一个 BaseClass,它有一个构造函数将 Implementation class(JerseyClientImpl) 设置为 jerseyClient。

public BaseClass(AuthDetails auth, String ID) {
    setListID(D);
    this.jerseyClient = new JerseyClientImpl(auth);
}

我正在扩展 BaseClass 以将我自己的实现类设置为 jerseyClient ,但我收到了提到的错误。更改 BaseClass 以添加默认构造函数不在我的控制范围内,因为我说它是一个外部 jar。你能建议我如何克服这个错误。

【问题讨论】:

    标签: java


    【解决方案1】:

    由于BaseClass有一个非默认构造函数,它没有自动生成的无参数默认构造函数。

    因此你的子类不能依赖默认构造函数(因为它不能调用基类不存在的默认构造函数),所以你的子类必须有一个显式构造函数调用基类的构造函数。

    具有相同参数的构造函数:

    public SubClass(AuthDetails auth, String ID) {
        super(auth,ID);
        ...
    }
    

    或者是一个没有参数的构造函数,它为基类的构造函数提供默认值:

    public SubClass() {
        super(null,"something");
        ...
    }
    

    【讨论】:

    • 感谢您的回复,但问题是添加 super(auth,ID) 正在调用 BaseClass 构造函数并设置 JerseyClientImpl(auth) 但我需要从子类传递 ProxyClientImpl。 public class MySubscribers extends Subscribers{ public MySubscribers(AuthenticationDetails auth,String listID) { //super(auth, listID);强迫我使用父构造函数,但我希望传递我的 impl。 //this.jerseyClient = new ProxyClientImpl(auth); }
    • @skk 你可能不能直接从你的子类的构造函数中设置this.jerseyClient,因为它可能是一个私有成员,但是如果超类有一个setter方法,你可以把你的构造函数在调用super(auth,ID) 之后调用setJerseyClient(new ProxyClientImpl(auth));
    【解决方案2】:

    在 Java 中,如果您没有显式提供对超类构造函数的调用作为构造函数中的第一条语句,那么它将插入对默认超类构造函数的隐式调用。如果没有默认的超类构造函数,那么你会得到你提到的错误。

    JLS, Section 8.8.7,声明:

    如果构造函数体不是以显式构造函数调用开始,并且被声明的构造函数不是原始类 Object 的一部分,则构造函数体隐式以超类构造函数调用“super();”开始,调用其直接超类的构造函数,不带参数。

    您必须显式调用超类构造函数,传递所有参数,如下所示:

    public JerseyClientImpl(AuthDetails auth, String ID) {
        super(auth, ID);
    
        // Rest of constructor code
    }
    

    【讨论】:

      【解决方案3】:

      首先,如果你在一个类中编写一些参数化的构造函数......该类的默认无参数构造函数不再存在。

      而且,当你尝试创建其子类的构造函数时,总是首先调用父类的无参数构造函数。如果它不存在,则会出现编译器错误。

      所以,在你的父类中定义无参数构造函数,或者只是在子类构造函数中调用父类的参数化构造函数。

      【讨论】:

        猜你喜欢
        • 2013-03-03
        • 2014-06-17
        • 2020-09-29
        • 2014-11-06
        • 2023-04-08
        • 1970-01-01
        • 2011-07-26
        • 2018-06-27
        相关资源
        最近更新 更多