“类型参数 T 正在隐藏类型 T”警告疑难解答

2022-08-31 20:35:49

我在 eclipse(最新版本)中收到以下代码的警告。

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

警告出现在“A”中的“T”处,并显示:“类型参数 T 隐藏了类型 T”。

奇怪的是,以下代码不会生成任何错误或警告。

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

但是现在我不能延长A,同时告诉它是什么类型。T

我完全糊涂了。有谁知道为什么会发生这种情况?


答案 1

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

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

只是为了扩展最后一个答案(我知道问题很旧并且已关闭),我将提供一个最简单的情况,您可以在其中理解错误:

想象一个具有泛型方法的接口,例如:

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

如果您尝试将其覆盖为:

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

编译器会警告您:

类型参数对象隐藏对象类型

它的意思是“Object”在这里是一个通用标签,它不是java.lang.Object。如果将对象类型更改为 V 或任何任意字母,则不会发生这种情况。但是您正在使用与实际定义的类发生冲突的 appelative,因此编译器会警告您,您的这个 Object 隐藏了否则将被理解为公共 Object 类的内容。


推荐