[英]Overriding interface method in Java
我正在嘗試使用現有的程序包在其上創建自己的應用程序。 但是我不知道如何調用接口參數化方法。
在使用JavaFX的程序包上,有一個類的構造函數是
public class App extends Application{
...
protected App(Logic logic) {
this(logic.configuration().welcomeScreen, logic.configuration().name, Optional.of(logic));
}
}
界面是這樣的:
public interface Logic extends X, Y {
default Configuration configuration() {
return new Configuration(1000, "Hello world", true);
}
default void initialize() {
System.out.println("Starting the application.");
}
}
和配置是這樣的:
public final class Configuration {
public final int tick;
public final String name;
public final boolean welcomeScreen;
public Configuration(int tick, String name, boolean welcomeScreen) {
this.tick = tick;
this.name = name;
this.welcomeScreen = welcomeScreen;
}
}
應用程序的輸出:
(1000, "Hello world", true)
現在,當我創建自己的App擴展時,覆蓋不會通過:
public class Test extends App implements Logic{
@Override
public Configuration configuration() {
return new Configuration(25, "Test", true);
}
public static void main(String[] args) {
launch(args); //launches the App
}
}
輸出:
(1000, "Hello world", true)
該應用程序仍會調用該接口的默認方法。 這是什么原因?在這種情況下,如何繞過默認方法?
子類應聲明一個構造函數,該構造函數顯式調用以下父構造函數:
protected App(Logic logic) {
this(logic.configuration().welcomeScreen, logic.configuration().name, Optional.of(logic));
}
否則,它將不會按照發布的代碼進行編譯...如果進行編譯,則意味着父類沒有no arg構造函數。 這將被隱式調用(在已編譯的類中),而不是要使用覆蓋的configuration()
方法調用的內容。
App和Logic不應在Test
耦合。
因此,您可以引入一個類來定義Logic
子類:
public TestLogic implements Logic{
@Override
public AppConfiguration configuration() {
return new AppConfiguration(25, "Test", true);
}
}
並添加Test
構造函數傳遞Logic
實例(這里this
):
public class Test extends App {
public Test() {
super(new TestLogic());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.