2012-03-16 83 views
3

在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(對象)必須覆蓋或實現我無法弄清楚超類型方法。

回答

4

的在CollectionConverter簽名是

Comparable<U> method4(U u); 

您聲明Overrider實現CollectionConverter<Integer>,從而類型參數U結合Integer 。然後簽名變爲:

Comparable<Integer> method4(Integer u); 

可以聲明一個在Overridermethod4(Object u),但該方法的簽名不重寫接口中指定method4(Integer u)任何比它如果你不使用泛型都多。

+0

但是,在類型擦除之後,所有類型參數均由Object或第一個邊界替換爲「extends」列表。就像前三種方法一樣,在擦除之後,前三種方法的簽名與Overrider類中的簽名完全相同。在這之後,method4的簽名和返回類型應該是:可比較的方法4(Object u),它與Overrider中的相同。所以,這是我的問題 – 2012-03-18 21:09:04

+0

@RobyYan - 泛型不僅僅是從最小上界向下鑄造的語法糖。在_after_編譯器檢查類型安全性類型擦除踢。泛型的整體思想是讓編譯器爲你做類型檢查。迫使編譯器進行分析,就好像類型擦除已經被應用一樣,將是無望的;幾乎沒有什麼可以與之合作的。 – 2012-03-18 21:50:44

+0

「泛型的全部概念是讓編譯器爲你做類型檢查,強制編譯器進行分析,就好像已經應用了類型擦除一樣,這是毫無希望的;幾乎沒有任何東西可以與它一起工作「。明白了,我幾乎忘記了泛型的最初目的,謝謝你的回答 – 2012-03-19 16:51:10

1

因爲在接口中,method4被聲明爲具有與接口(U)相同的類型參數。如果你把它改成別的東西,它應該可以工作。

例如

<A> Comparable<A> method4(A a); 
2

問題是可變U類型在該點被綁定到Integer。如果更改聲明

public Comparable method4(Integer u) ... 

這是一個覆蓋