一個實現類實現多個接口中的同名方法問題


話不多說,看代碼

假設兩個接口分別為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");
     }
}

  這樣不會報錯因為這個時候A1和A2的f()都聲明了 ClonseNotSupportedException,這個異常就是它們拋出的異常的交集.當然對於這一點,需要注意的是,僅僅是針對受檢查的異常(Checked Exception) 才起作用的,對於非受檢查的異常(Unchecked Exception)則不適用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM