Подтвердить что ты не робот

Устранение неисправностей "Параметр типа T скрывает предупреждение типа T

Я получаю предупреждение в eclipse (самая последняя версия) для следующего кода.

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

Предупреждение появляется в "T" в "A" и читается: "Типовой параметр T скрывает тип T".

Странная часть состоит в том, что следующий код не генерирует ошибок или предупреждений.

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

Но теперь я не могу расширить A, сообщая ему, какой тип T.

Я совершенно смущен. Кто-нибудь знает, почему это происходит? Спасибо.

4b9b3361

Ответ 1

У вас где-то есть класс или интерфейс с именем T, или вы используете T как конкретное имя типа где-то вместо параметра типа (что означает, что вы, возможно, забыли где-то в другом месте, например, в приложении class, чтобы указать, что 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

Я пытаюсь:

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

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

на eclipse Indigo Service Release 2 и нет предупреждений или ошибок

Ответ 3

Несмотря на то, что этот вопрос уже дан, поскольку строка темы о ( "Тип параметра 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); 
}

Ответ 4

Просто чтобы развернуть последний ответ (я знаю, что вопрос старый и закрытый), я расскажу о простом случае, где вы можете понять ошибку:

Представьте интерфейс с общим методом, например:

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

Если вы попытаетесь переопределить его как:

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

Компилятор предупреждает вас:

Тип параметра Object скрывает тип Object

Что это значит, что "Object" является общей меткой здесь, это не java.lang.Object. Если вы изменили тип объекта на V или любую произвольную букву, этого не произойдет. Но вы используете и appelative, который сталкивается с определенным определенным классом, поэтому компилятор предупреждает вас о том, что этот Object вы скрываете то, что в противном случае понимается как общий класс Object.