故障排除“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类的东西。