2011-12-06 29 views
3

爲什麼我得到基於Eclipse編譯錯誤,在一個接口的定義如下:
區是一個接口。Java的通用模板錯誤

public interface Shape { 
    ... 
    public Comparator<T extends Area> getComparator(); 
} 

,而不是如果我用,而不是:

public interface Shape { 
    ... 
    public Comparator<? extends Area> getComparator(); 
} 
+0

'比較器<?擴展Area>'很沒用;你不能用它來比較任何東西 – newacct

回答

5

因爲編譯器不知道什麼T應該是或代表。現在,如果你有像public interface Shape<T>這樣的接口聲明,我們可能會得到一些東西來處理。

+1

哦對!但是,如果我不想一致性,但剛纔說的比較應該是實現接口,然後一類的條件「?擴展區>應該沒問題?此外,它是否皺眉 - 使用?在泛型? –

+1

@CaptainJacksparrow這是正確的,沒有,沒有什麼錯,在仿製藥使用'?'。 –

3

T未在您顯示的代碼示例中定義。

下面列出的是合法的:

public interface Shape { 
    ... 
    public <T extends Area> Comparator<T> getComparator(); 
} 

或:

public interface Shape<T extends Area> { 
    ... 
    public Comparator<T> getComparator(); 
} 
2

第一種方法是將要返回基於一個參數的對象,如果它的類擴展Area類。

第二種方法不需要等待參數來獲取類型。

爲了得到第一個工作,無論是在界面上推斷泛型:

public interface Shape<T extends Area> 

或參數的方法:

public <T extends Area> Comparator<T> getComparator(); 

編譯器需要知道T可以是什麼,以及T基於參數或具有推斷通用結構的定義。