在JLS(Java語言規範)中:subignature的概念被設計用來表示兩個方法之間的關係,這兩個方法的簽名不相同,但其中一個可能會覆蓋另一個。具體來說,它允許一個方法,其簽名不使用泛型來覆蓋該方法的任何泛型化版本。替代泛型方法
interface CollectionConverter<U> {
<T> List<T> toList(Collection<T> c);
void fooMethod(Class<?> c);
<E>Comparable<E> method3(E e);
Comparable<U> method4(U u);
}
class Overrider implements CollectionConverter<Integer> {
@Override
public List toList(Collection c) {
return null;
}
@Override
public void fooMethod(Class c) {
}
@Override
public Comparable method3(Object o) {
return null;
}
@Override
// compile error, have to change Object to Integer
public Comparable method4(Object u) {
return null;
}
}
根據JLS,我明白了爲什麼第3種方法工作得很好,但爲什麼有方法4編譯錯誤,說類型超控器的方法,方法4(對象)必須覆蓋或實現我無法弄清楚超類型方法。
但是,在類型擦除之後,所有類型參數均由Object或第一個邊界替換爲「extends」列表。就像前三種方法一樣,在擦除之後,前三種方法的簽名與Overrider類中的簽名完全相同。在這之後,method4的簽名和返回類型應該是:可比較的方法4(Object u),它與Overrider中的相同。所以,這是我的問題 – 2012-03-18 21:09:04
@RobyYan - 泛型不僅僅是從最小上界向下鑄造的語法糖。在_after_編譯器檢查類型安全性類型擦除踢。泛型的整體思想是讓編譯器爲你做類型檢查。迫使編譯器進行分析,就好像類型擦除已經被應用一樣,將是無望的;幾乎沒有什麼可以與之合作的。 – 2012-03-18 21:50:44
「泛型的全部概念是讓編譯器爲你做類型檢查,強制編譯器進行分析,就好像已經應用了類型擦除一樣,這是毫無希望的;幾乎沒有任何東西可以與它一起工作「。明白了,我幾乎忘記了泛型的最初目的,謝謝你的回答 – 2012-03-19 16:51:10