我对Java 8功能非常陌生,并尝试了解默认方法.有没有比使用匿名类更简单的方法来通过同一接口的另一个默认方法来调用默认方法?
例如:
public class Frame{
public static void main(String... args){
Frame.C c= new Frame.C();
c.doSomething();
}
public interface A{
public default void doSomething(){
System.out.println("A");
}
}
public interface B extends A {
@Override
public default void doSomething(){
System.out.println("B");
//is there an easier way to invoke that method??
new B(){}.other();
}
default public void other(){
//doSomething();
System.out.println("other");
}
}
public static class C implements B{
@Override
public void other(){
Lambda.B.super.other();
System.out.println("C");
}
}
}
解决方法:
您的意图还不是很清楚,但是构造了new B(){}.other();暗示两件事:
>您不想调用替代方法的实现
>在完全不同的实例(新B(){})上调用other()的实例时,与之无关的实例显然是不可行的
这两件事意味着您应该改为使用静态方法:
public interface B extends A {
@Override
public default void doSomething(){
System.out.println("B");
otherInB();
}
default public void other(){
otherInB();
}
static void otherInB() {
//doSomething();
System.out.println("other");
}
}
由于您的原始方法名称未包含有用的信息,因此也无法为该静态方法建议一个有用的名称.
请注意,Java 9将在接口中引入对私有方法的支持,这允许将otherInB()隐藏到其他类中,甚至在必须在同一实例上使用其他方法的情况下使其变为非静态的.
如果Java 8中方法的可见性是一个问题,请考虑非多态方法的实际位置无关紧要,因此您始终可以使用伴随类:
public interface B extends A {
@Override
public default void doSomething(){
System.out.println("B");
BHelper.other();
}
default public void other(){
BHelper.other();
}
}
…
/* not public */ class BHelper {
/* not public */ static void other() {
//doSomething();
System.out.println("other");
}
}
如果实现需要实际的B实例,这甚至可以工作,因为您可以将其作为参数传递.
public interface B extends A {
@Override
public default void doSomething(){
System.out.println("B");
BHelper.other(this);
}
default public void other(){
BHelper.other(this);
}
}
…
/* not public */ class BHelper {
/* not public */ static void other(B instance) {
//doSomething();
System.out.println("other");
}
}
标签:default-method,java-8,java 来源: https://codeday.me/bug/20191027/1943430.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。