話不多說,看代碼
假設兩個接口分別為Interface A1和Interface A2,實現類為 a
接口一
public interface A1 { void f(); }
接口二
public interface A2 { void f(); }
實現類
public class a implements A1, A2 { @Override public void f() { System.out.println("fff"); } }
當時有個疑問:如果兩個不同接口中的方法名稱相同,使用一個實現類同時實現兩個接口,那么實現類中實現的方法是哪個接口中的呢?
其實,這種疑問是多余的,因為a中的f()既是A1中的f()也是A2中的f()。因為既然a這個類沒有發生編譯錯誤,那就說明它既實現A1也實現了A2,也就是說A1中的f()與A2中的f()在實現類a中是相安無事的。通過JUnit測試:
public class TestInterface { @Test public void testF() { A1 a1 = new a(); A2 a2 = new a(); a1.f(); a2.f(); } }
打印結果:
fff fff
將接口的方法變更一下,接口中的方法名稱相同,但是返回類型不同,結果會怎樣呢?
接口一
public interface A1 { int f(); }
接口二
public interface A2 { void f(); }
實現類
public class a implements A1, A2 { @Override public void f() { System.out.println("fff"); } }
此時在IDE上面就會報錯,在idea中報錯
也就是說,多個接口中的方法名稱相同,但是返回類型不同,不能使用一個實現類同時實現兩個接口。
解決方法:實現類里面使用內部類,分別實現兩個接口。
繼續變更
接口一
public interface A1 { int f()throws IOException;
}
接口二
public interface A2 { void f()throws CloneNotSupportedException;
}
實現類
public class a implements A1, A2 { @Override public void f() throws IOException, CloneNotSupportedException{
System.out.println("fff");
}
}
此時IDE依然報錯,報錯內容如下
對於這個現象,在《Java 解惑》有所解釋:
一個方法可以拋出的受檢查異常集合是它所適用的所有類型的聲明要拋出的受檢查異常集合的交集,而不是合集。
也就是說,在a的f()上聲明的異常只能是在A1和A2的f()上都聲明過的異常。因為此示例中,A1拋出的是IOException,而A2拋出的是CloneNotSupportedException,即A1與A2的f()所拋出的異常是沒有交集的,因此,a的f()是無法聲明拋出任何異常的。
可以將上面的代碼修改為:
接口一
public interface A1 { int f()throws IOException,CloneNotSupportedException;
}
接口二
public interface A2 { void f()throws CloneNotSupportedException;
}
實現類
public class a implements A1, A2 { @Override public void f() throws CloneNotSupportedException{
System.out.println("fff");
}
}