簡體   English   中英

Java中的覆蓋接口方法

[英]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.

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