2012-04-04 363 views
39

我在下面的代碼的eclipse(最新版本)中收到警告。疑難解答「類型參數T隱藏類型T」警告

public interface A<T> extends B<T> { 
    public T getObject(); 
} 

警告出現在'A''T'處並且顯示爲:「類型參數T隱藏類型T」。

奇怪的部分是下面的代碼不會生成錯誤或警告。

public interface A extends B<T> { 
    public T getObject(); 
} 

但是現在我不能在擴展A時告訴它T是什麼類型。

我完全困惑。任何人都知道這是爲什麼發生?謝謝。

+6

在我的情況下,Eclipse已經自動導入了'org.apache.poi.ss.formula.functions.T',這導致了警告。 – 2014-07-07 11:57:46

回答

45

你的地方有一個名爲T類或接口,或者您使用的T作爲具體類型名稱,而不是某個地方作爲一個類型參數(這意味着你可能已經忘記了別的地方,例如在一個封閉的班,指定T是一個類型參數)?我可以用這個重現您的問題:

class T { // A concrete type T 
} 

interface B<T> { // warning: The type parameter T is hiding the type T 
} 

interface A<T> extends B<T> { // warning: The type parameter T is hiding the type T 
    T getObject(); 
} 

如果我刪除T類,它就會消失。

+2

就是這樣,謝謝!事實證明,我不小心導入了一個與類型參數同名的類。我拿出進口,它工作得很好。 – nikdeapen 2012-04-04 13:40:39

+12

當內部泛型類重新使用與封閉類(也泛型)類相同的Type參數時,這也會發生。 – mgaert 2013-01-16 14:19:26

2

我嘗試:

public interface B<T> { 
    T getObject(); 

    public interface A<T> extends B<T>{ 
     T getObject(); 
    } 
} 

基於Eclipse靛藍服務發佈2並沒有警告或錯誤

2

即使這個問題已經回答了,因爲主題行約(「類型參數T隱藏類型T「),只是想補充一點,這個警告並不總是意味着在類路徑(或內部類)中聲明瞭一個類或實際類型」T「,如所有答案/註釋所示。

考慮以下幾點:

public class Cache<K extends Comparable<K>,V> { 

    private final ConcurrentHashMap<K,V> _concurrentMap = new ConcurrentHashMap<K,V>(); 

    public <K,V> void add(K key ,V value){ // Compiler warning - The type parameter V is hiding type V (as also for K) 

    _concurrentMap.put(key, value); //Compiler error - K and V passed to add are now being considered different 
            //from whats declared for _concurrentMap variable 
    } 

    public V get(K key){ 
    return _concurrentMap.get(key); 
    } 

    public int size(){ 
    return _concurrentMap.size(); 
    } 
} 

由於K,V是在類級別聲明,該方法還添加 「繼承」 了。所以你最終會得到同樣的警告。

下面消除當然

public <E,F> void add(K key ,V value){ 
    _concurrentMap.put(key, value); 
} 

的警告和編譯器錯誤而我原來的方法是這樣的。(不需要額外的泛型類型爲我的方法)

public void add(K key ,V value){ 
    _concurrentMap.put(key, value); 
} 
2

只是爲了擴大最後的答案(我知道的問題是舊的和封閉的),我將提供一些簡單的情況下,你可以理解的錯誤:

想象一下,一個通用的方法,如接口:

<T> Output<T> doSomething(Input<T> input); 

如果你試圖重寫它爲:

@Override 
public <Object> Output<Object> soSomething(Input<Object> input){ 
    /*..*/ 
} 

編譯器會發出警告:

The type parameter Object is hiding the type Object

它的意思是:「對象」是一個通用的標籤,在這裏,它不是java.lang.Object繼承。如果您將對象類型更改爲V或任何任意字母,則不會發生。但是你正在使用和appeng與實際定義的類發生衝突,所以編譯器會警告你,你的這個對象正在隱藏否則將被理解爲普通對象類的東西。

+1

由於答案的顯示順序不固定,「最後答案」並不能真正指出你的答案。 – 2015-12-20 07:44:45

+0

Plaiska是我的意思 – Whimusical 2015-12-22 00:08:30