故障排除“类型参数T隐藏类型T”警告

时间:2012-04-04 13:08:16

标签: java generics warnings

我在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.

我完全糊涂了。任何人都知道为什么会这样吗?谢谢。

4 个答案:

答案 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);
}