51

次のコードについて、Eclipse (最新バージョン) で警告が表示されます。

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

私は完全に混乱しています。なぜこれが起こっているのか知っている人はいますか?

4

5 に答える 5

63

という名前のクラスまたはインターフェースがどこかにありますか、または型パラメーターとしてではなく、どこかで具体的な型名としてT使用していますか (つまり、それが型パラメーターであることを指定するために、たとえば外側のクラスなど、他の場所で忘れている可能性があります)。 )? これであなたの問題を再現できます:TT

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();
}

class を削除するTと、消えます。

于 2012-04-04T13:20:43.047 に答える
7

最後の回答を拡張するために(質問が古くて閉じられていることは知っています)、エラーを理解できる最も単純なケースを提供します:

次のような一般的なメソッドを持つインターフェイスを想像してください。

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

次のようにオーバーライドしようとすると:

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

コンパイラは次のように警告します。

型パラメーター Object は型 Object を隠しています

これが意味するのは、ここでの「オブジェクト」は一般的なラベルであり、java.lang.Object ではないということです。オブジェクト タイプを V または任意の文字に変更した場合、それは起こりません。しかし、実際に定義されたクラスと衝突する appelative を使用しているため、コンパイラは、この Object が、そうでなければ共通の Object クラスとして理解されるものを隠していることを警告します。

于 2015-12-13T15:56:12.707 に答える
5

この質問には既に回答がありますが、件名は ("型パラメーター 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 はクラス レベルで宣言されているため、メソッド add もそれを「継承」します。したがって、同じ警告が表示されます。

以下はもちろん警告とコンパイラエラーを削除します

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

そして、私のオリジナルの方法はこれです。(私のメソッドにジェネリック型を追加する必要はありません)

public void add(K key ,V  value){ 
    _concurrentMap.put(key, value); 
}
于 2015-08-16T15:44:32.690 に答える
2

私は試します:

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

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

Eclipse Indigo Service Release 2 では、警告やエラーはありません

于 2012-04-04T13:22:09.693 に答える