簡體   English   中英

Java子類實現強制構造函數

[英]Java subclass implementation mandatory constructor

Java中有什么方法可以強制子類或接口實現以具有具有給定簽名的構造函數?

假設我有:

public interface MyInterface {
    // any methods
}

要么

public abstract class MyBaseClass {
    // any abstract methods
}

現在,有什么可以做的

public class MySubClass extends MyBaseClass {
    public MySubClass(String s) { }
}

要么

public class MySubClass implements MyInterface {
    public MySubClass(String s) { }
}

總是有一個構造函數將String作為唯一的輸入參數?

顯而易見的解決方法是使用帶有String的方法創建工廠接口,並在需要時將其注入。 這不是我想做的。

並非如此,我認為您可以獲得的最接近的東西是:

abstract class B {

    public B(String s) {
    }
}

public class A extends B {
    public A(String s) {
        super(s);
    }
} 

這迫使A實現一個非默認構造函數,該構造函數必須調用super(String)但不能阻止以下操作:

public class A extends B {
    public A() {
        super("");
    }
} 

我曾多次希望存在這樣的東西,但遺憾的是沒有。 甚至像David Soroko所建議的那樣也不起作用,因為仍然不會強迫子類具有String構造函數-它可以將喜歡的任何String傳遞給super 簡而言之,Java語法本身沒有這種東西。

我想最接近這種功能的是如果有人構建了一個注釋處理器,該處理器允許您使用@MustHaveUnaryConstructor(String.class)類的注釋,然后如果任何子類不具有此類構造函數,則會導致編譯失敗並告訴您哪個子類違反了合同。 但是我還沒有發現這種東西,而且我對注釋處理的知識還不足以自己構建。 TL; DR,不,您不能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM