阐明多重继承的概念:钻石结构问题是否会发生?

SHK*_*uru 4 java interface multiple-inheritance diamond-problem

假设您有两个接口I1和I2,两个接口都具有相同的方法

1)public int add(int a) throws exception e1    //(Interface 1)

2)public int add(int a) throws exception e2    //(Interface 2)
Run Code Online (Sandbox Code Playgroud)

现在一个类实现了I1和I2.

@override
public int add(int a) exception e1
{
//adding operation
}
Run Code Online (Sandbox Code Playgroud)

注意:据我所知,如果实现多个具有相同方法的接口,那么实现类中只有一个实现.

  1. 编译器是否根据throws子句推断此方法是来自I1还是I2?是否需要方法签名澄清?(我知道签名包括传递的名称和参数.)

  2. 如果我们已经实现了两个接口,然后我们只抛出e1,那么编译器会允许这个,因为实现类并没有真正实现这两个接口?它会导致钻石结构问题吗?

  3. 我们是否需要使用throws子句e1和第二次e2实现相同的方法?当我尝试这个时,编译器告诉我我有重复的方法.

  4. 如果我们首先实现I1然后它说它是I1的方法,如果我们首先编写I2然后它说它的I2的方法.解释为什么会这样.

JB *_*zet 7

接口定义合同.如果接口定义了方法

void foo() throws SomeException;
Run Code Online (Sandbox Code Playgroud)

然后它说:所有实现类必须有一个方法foo,返回void,不接受任何参数,并且允许抛出SomeException 但没有其他类型的checkd异常.

实现方法当然可以选择不抛出任何异常,因为它不会违反接口方法的合同.throws意味着:此方法可能会在某些情况下抛出此异常.

所以,一个声明为的方法

public void foo();
Run Code Online (Sandbox Code Playgroud)

在实现类中对上面定义的接口有效.

所以,在你的例子中,

public int add(int a) throws Exception1
Run Code Online (Sandbox Code Playgroud)

是一个有效的方法声明来覆盖

int add(int a) throws Exception1
Run Code Online (Sandbox Code Playgroud)

不是有效的

int add(int a) throws Exception2
Run Code Online (Sandbox Code Playgroud)

(当然,除非Exception1是Exception2的子类).

如果在Excption1和Exception2之间没有继承来实现这两个接口,那么唯一的方法就是拥有一个不会抛出任何异常的方法.这是填补这两份合约的唯一可能性.