我正在打字,我想知道如何在静态上下文中调用默认方法,我有一个这样的代码段。
interface InterfaceWithDefaultMethod{
public default void saySomething(final int a,final int b){System.out.println(String.format("Parameters are %d %d",a,b));}
}
public class StaticsMethodIsNotOverriden2 implements InterfaceWithDefaultMethod {
public static void main(String[] args) {
final StaticsMethodIsNotOverriden2 clazz = new StaticsMethodIsNotOverriden2();
clazz.saySomething(13,20);//Overriden method call with 13 20
clazz.callDefaultSaySomethingFromInstance();//Parameters are 1 2
/*HOW CALL public default void saySomething(final int a,final int b) METHOD HERE....????*/
clazz.InterfaceWithDefaultMethod.super.saySomething(1, 2);/*no enclosing instance of type InterfaceWithDefaultMethod is in scope*/
}
@Override
public void saySomething(int a, int b) {
System.out.println(String.format("Overriden method call with %d %d",a,b));
}
//THIS IS WHAT A WANT TO DO BUT IN STATIC CONTEXT...
private void callDefaultSaySomethingFromInstance(){
InterfaceWithDefaultMethod.super.saySomething(1, 2); /*CALLING DEFAULT METHOD FROM INSTANCE CONTEXT*/
}
}
Run Code Online (Sandbox Code Playgroud)
可以使用StaticsMethodIsNotOverriden2实例从静态上下文调用InterfaceWithDefaultMethod-> saySomething方法的默认方法吗?
很抱歉,问题很简单。
这是行不通的。
否。default方法是实例方法,在这种情况下,将启动动态绑定。没有任何方法可以让重写方法的客户端强制调用超级实现。这只能在子类中完成(就像您在中所做的那样callDefaultSaySomethingFromInstance)
您唯一的选择是在子类中公开一个不同的方法,并使该方法调用已实现的接口的默认方法:
class StaticsMethodIsNotOverriden2 implements InterfaceWithDefaultMethod {
public static void main(String[] args) {
...
clazz.superSaySomething(1, 2);
}
//a different name/signature needed
public void superSaySomething(int a, int b) {
System.out.println(String.format("Forcing super method call with %d %d", a, b));
//the subclass calls default method
InterfaceWithDefaultMethod.super.saySomething(a, b);
}
@Override
public void saySomething(int a, int b) {
System.out.println(String.format("Overriden method call with %d %d", a, b));
}
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |