2016-12-26 138 views
0

我有一個通用接口A<T>,我有一個B類實現A<String>。我創建了一個類C,它延伸B並實施A<Number>。 爲C,我得到一個編譯錯誤說法:無法實現具有不同類型參數的接口

A cannot be inherited with different type arguments <String> and <Number>.

這是爲什麼不允許? 如果答案是類型刪除,請詳細解釋。

示例代碼:

public interface A<T> { 

} 

public class B implements A<String> { 

} 

public class C extends B implements A<Number> { 
} 
+2

如果你提供了一個代碼框架來處理它,那麼回答這個問題會稍微容易些。沒什麼特別的,但足以重現你面臨的同樣的錯誤。 – Makoto

+0

@Raj在問題上請 – GurV

+0

怎麼可能?考慮一下。 C已經實現了A 到B. – GurV

回答

2

這是沒有意義的,如果你能,誠實。

這裏的情景:

  • B實現A並結合A<T>A<String>。從B
  • C繼承(這是已經勢必A<String>),和你想,也能實現A<Number>

你不能有一種類型實現兩種方式。

如果你想以某種方式結合NumberC,那麼你就必須有類型C,而不僅僅是A

這將編譯但它看起來很奇怪:

public class C<T> extends B implements A<String> { 

} 

歸根結底,這真的歸結到您的層次結構需要如何進行佈局。如果你確實需要BC之間的關係,那麼用這種方式來具體化它們的類型是沒有意義的;只需讓他們使用T作爲通用。最後,憑藉繼承權,您仍然可以通過中的AC訪問總合同,因此您無需實施它。

public interface A<T> { 


} 

public class B<T> implements A<T> { 

} 

public class C<T> extends B<T> { 

} 
1

Java語言規範在§8.1.5狀態以下:

類不能同時是兩種接口類型 它們是相同的通用的不同參數的子類型接口 (第9.1.2節)或通用接口 的參數化的子類型以及命名相同通用接口的原始類型或編譯時間 錯誤。

這一要求是爲了引入以支持 翻譯類型擦除(§4.6)。

這意味着擦除後,您的類可以以相同的簽名結束方法(如果有的話)。詳情請參閱Angelika Langer的site

相關問題