Java中的重写接口方法
我正在尝试使用现有的软件包在上面创建我自己的应用程序。但是,我不知道如何调用接口参数化方法 在使用JavaFX的包中,有一个类的构造函数是Java中的重写接口方法,java,javafx,methods,interface,overriding,Java,Javafx,Methods,Interface,Overriding,我正在尝试使用现有的软件包在上面创建我自己的应用程序。但是,我不知道如何调用接口参数化方法 在使用JavaFX的包中,有一个类的构造函数是 public class App extends Application{ ... protected App(Logic logic) { this(logic.configuration().welcomeScreen, logic.configuration().name, Optional.of(logic)); } } 界面是这样的: p
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)
现在,当我创建自己的应用程序扩展时,覆盖不会通过:
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));
}
否则它将不会根据发布的代码编译。。。如果它编译,则意味着父类有一个无参数构造函数。它将被隐式调用(在编译的类中),而这不是使用重写的configuration()
方法所要调用的
应用程序和逻辑不应在测试中耦合
因此,您可以引入一个类来定义逻辑
子类:
public TestLogic implements Logic{
@Override
public AppConfiguration configuration() {
return new AppConfiguration(25, "Test", true);
}
}
并添加Test
构造函数以通过Logic
实例(此处this
):
这是一个JavaFX应用程序,所以Test
可能会在后台自动实例化。听起来不错。我对JavaFX了解不多。谢谢。出现错误:在调用超类型构造函数之前,无法引用此到super(this)
。尝试执行应用程序(此)
,但无法识别应用程序。应用程序类不应该先加载吗?编辑:我的坏朋友没有看到评论说它就在这里。我看不到将接口作为参数传递给构造函数的方法。我的方法也不好。我忘记了一条基本规则:构造函数在调用构造函数时不能引用此
。我更新了。您如何打印输出?不带参数的App
的构造函数在哪里?(如果超类中有可用的构造函数,Test
中没有构造函数实现,这将导致编译时错误。)您是否绝对确定启动的是Test
(doSystem.out.println(getClass());
检查)。此外,请注意App
构造函数调用configuration()
两次,这将创建2个实例,而不是1个。您应该添加一个包含两个参数的私有构造函数,Configuration
和Logic
,以避免出现这种情况。
public class Test extends App {
public Test() {
super(new TestLogic());
}
}