如果两个接口包含相同的默认方法,会发生什么?

6
如果我有两个接口具有相同的默认方法,并且都使用一个类进行实现/请查看此程序。
interface alpha {
  default void reset() {
    System.out.println("This is alpha version of default");
  }
}

interface beta {
  default void reset() {
    System.out.println("This is beta version of default");
  }
}

class MyClass implements alpha, beta {
  void display() {
    System.out.println("This is not default");
  }
}

class main_class {
  public static void main(String args[]) {
    MyClass ob = new MyClass();
    ob.reset();
    ob.display();
  }  
}

那接下来会发生什么?而且我在这个程序中遇到了无关的错误。


接口是纯抽象的,只包含声明而不包含实现。 - Shriram
1
@Shriram 在Java 8中,接口可以包含使用默认方法的实现。 - Bohuslav Burghardt
4
我怀疑“不相关的错误”会告诉你这个问题的答案。 - chrylis -cautiouslyoptimistic-
2个回答

7

如果Java 8的默认方法存在相同的签名,你无法同时实现多个接口(除非在子类中显式覆盖)。

你可以通过实现该方法来解决这个问题。例如:

class MyClass implements alpha, beta {
  void display() {
    System.out.println("This is not default");
  }

  @Override
  public void reset() {
    //in order to call alpha's reset
    alpha.super.reset();
    //if you want to call beta's reset 
    beta.super.reset();

  }
}

当我尝试使用@override方法运行上述代码时,会出现错误cannot find symbol @override - Manohar Kumar
@ManoharKumar @Override 的 O 是大写的。 - 11684
那么要调用 reset() 方法的 alpha 版本,我们在 @Override public void reset(){ } 代码中应该使用什么语句? - Manohar Kumar

1
实际上,这两种方法在实现它们的类中是相同的。例如,在Intellij中尝试实现这两种方法,您只会得到一个方法。即使您想要为两个方法声明不同的签名,也无法声明这两种方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接