我在eclipse(最新版本)中收到以下代码的警告。
public interface A<T> extends B<T> {
public T getObject();
}
警告出现在'A'中的'T'处,并显示:“类型参数T隐藏了类型T”。
奇怪的是,以下代码不会产生任何错误或警告。
public interface A extends B<T> {
public T getObject();
}
但是现在我不能在告诉它T是什么类型时扩展A.
我完全糊涂了。任何人都知道为什么会这样吗?谢谢。
答案 0 :(得分:49)
你在某处有一个名为T
的类或接口,或者你在某处使用T
作为具体的类型名称而不是作为类型参数(这意味着你可能已经忘记了其他地方,因为在封闭类中的示例,指定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
,它就会消失。
答案 1 :(得分:3)
只是为了扩展最后一个答案(我知道问题是陈旧且已关闭),我将提供一个最简单的案例,您可以在其中理解错误:
想象一下具有通用方法的接口,例如:
<T> Output<T> doSomething(Input<T> input);
如果您尝试将其覆盖为:
@Override
public <Object> Output<Object> soSomething(Input<Object> input){
/*..*/
}
编译器警告你:
类型参数Object隐藏类型Object
这意味着&#34;对象&#34;这里是一个通用标签,它不是java.lang.Object。如果您将对象类型更改为V或任意字母,则不会发生这种情况。但是你正在使用和appelative与实际定义的类冲突,所以编译器警告你,你的这个Object隐藏了另外被理解为公共Object类的东西。
答案 2 :(得分:2)
我试试:
public interface B<T> {
T getObject();
public interface A<T> extends B<T>{
T getObject();
}
}
在eclipse Indigo Service Release 2上没有警告或错误
答案 3 :(得分:0)
只需删除返回类型前面的通用 allTopics.sort();
即可删除警告。
这是先前的代码:
<T>
下面的警告消失了
private <T> LocalDate convertToDate(Root<T> root, String name, String value) {
..........
..........
return LocalDate.parse(value, dtf);
}