在重寫時,如果只涉及raw/unerased類型,則不需要額外的類型變量來縮小超類方法的返回類型。例如:Narrowing return types on inheritance (generics involved)使用泛型的奇怪編譯器行爲:縮小繼承的返回類型參數
但是,如果類型參數變窄 - 而原始類型保持不變 - 則需要一個附加的方法類型變量。
例子:
import java.util.List;
public class InheritanceTest {
public interface A<T> {
A<T> test();
List<A<T>> testList1();
<U extends A<T>> List<U> testList2();
<U> List<A<T>> testList3();
// extending class/interface does not need to suppress warnings:
List<? extends A<T>> testList4();
}
public interface B extends A<Integer> {
@Override
B test();
@Override
List<B> testList1();
@Override @SuppressWarnings("unchecked")
List<B> testList2();
@Override @SuppressWarnings("unchecked")
List<B> testList3();
@Override
List<B> testList4();
}
}
編譯器抱怨不兼容的返回類型爲testList1()
,但其餘三種方法不報告任何錯誤。 `
testList3()
中未使用的變量如何使編譯器關閉?
請發表[mcve] –
謝謝。我簡化了這個例子。 – Andi
「如果兩個方法或構造函數M和N具有相同的名稱,相同的類型參數(如果有)(§8.4.4),並且在將N的形式參數類型修改爲M的類型參數,相同的形式參數類型。「如果您沒有相同的類型參數,則它們不是覆蓋等效的。 –