故障排除“types参数T隐藏typesT”警告

在下面的代码中,我在eclipse(最新版本)中得到了一个警告。

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

警告出现在“A”的“T”处,并且显示:“types参数T隐藏typesT”。

奇怪的部分是下面的代码不会产生错误或警告。

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

但是现在我不能一边告诉它T是什么types一边。

我完全困惑。 任何人都知道这是为什么发生? 谢谢。

你在哪里有一个名为T的类或接口,或者你是否将T用作具体types名称而不是types参数(这意味着你可能忘记了其他地方,例如在封闭类中,指定T是一个types参数)? 我可以用这个重现你的问题:

 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 ,它会消失。

我尝试:

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

在日食靛蓝服务版本2,没有任何警告或错误

即使这个问题已经被回答,因为主题行是关于(“types参数T隐藏typesT”),只是想添加这个警告并不总是意味着有一个类或实际types“T”在类path(或内部类)中的所有答案/注释build议的地方声明。

考虑以下:

 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是在类级别声明的,所以方法也会“inheritance”它。 所以你最终得到相同的警告。

下面去掉警告和编译器错误当然

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

而我原来的方法是这样的。 (对于我的方法,不需要额外的通用types)

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

只是为了扩大最后的答案(我知道问题是旧的,closures),我会提供一个最简单的情况下,你可以了解错误:

设想一个通用方法的接口,如:

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

如果您尝试将其覆盖为:

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

编译器警告你:

types参数Object隐藏Objecttypes

这意味着“对象”是一个通用的标签,它不是java.lang.Object。 如果你改变对象types为V或任何任意字母,那不会发生。 但是你正在使用和appeng与一个实际定义的类相冲突,所以编译器会警告你这个Object是隐藏了被认为是普通Object类的东西。