Устранение неисправностей "Параметр типа 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.
Я совершенно смущен. Кто-нибудь знает, почему это происходит? Спасибо.
Ответы
Ответ 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.