假设您有两个接口I1和I2,这两个接口具有相同的方法
1)public int add(int a) throws exception e1 //(Interface 1)
2)public int add(int a) throws exception e2 //(Interface 2)
现在一个类实现了I1和I2。
@override
public int add(int a) exception e1
{
//adding operation
}
注意:我知道如果你实现多个具有相同方法的接口,那么实现类中只有一个实现。
编译器是否根据throws子句推断此方法是来自I1还是I2?是否需要方法签名澄清? (我知道签名包括传递的名称和参数。)
如果我们已经实现了两个接口,然后我们只抛出e1,那么编译器会允许这个,因为实现类并没有真正实现这两个接口?它会导致钻石结构问题吗?
我们是否需要使用throws子句e1和第二次e2实现相同的方法?当我尝试这个时,编译器告诉我我有重复的方法。
如果我们首先实现I1,那么它表示它是I1的方法,如果我们首先编写I2,那么它会说它是I2的方法。解释为什么会这样。
答案 0 :(得分:7)
接口定义合同。如果接口定义了方法
void foo() throws SomeException;
然后它说:所有实现类必须有一个方法foo,返回void,不接受任何参数,并允许抛出SomeException 但没有其他类型的checkd异常。
实现方法当然可以选择不抛出任何异常,因为它不会违反接口方法的约定。 throws
表示:在某些情况下,此方法可能会抛出此异常。
所以,一个声明为
的方法public void foo();
实现类中的对上面定义的接口有效。
所以,在你的例子中,
public int add(int a) throws Exception1
是一个有效的方法声明,可以覆盖
int add(int a) throws Exception1
但不对
有效int add(int a) throws Exception2
(当然,除非Exception1是Exception2的子类)。
唯一的方法是,如果在Excption1和Exception2之间没有继承,那么实现这两个接口的方法就是不要抛出任何异常。这是填写这两份合约的唯一可能性。
答案 1 :(得分:1)