51

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

我完全糊涂了。有谁知道为什么会这样?

4

5 回答 5

63

您是否在某处有一个名为 的类或接口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();
}

如果我删除 class T,它就会消失。

于 2012-04-04T13:20:43.047 回答
7

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

想象一个具有通用方法的接口,例如:

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

如果您尝试将其覆盖为:

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

编译器会警告您:

类型参数 Object 隐藏了类型 Object

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

于 2015-12-13T15:56:12.707 回答
5

即使这个问题已经回答了,因为主题行是关于 ("The type parameter T is hidden the type T") ,只是想补充一点,这个警告并不总是意味着有一个类或实际类型“T”正如所有答案/评论所建议的那样,在类路径(或内部类)中的某处声明。

考虑以下:

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

下面当然删除了警告和编译器错误

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

而我原来的方法是这样的。(我的方法不需要额外的泛型类型)

public void add(K key ,V  value){ 
    _concurrentMap.put(key, value); 
}
于 2015-08-16T15:44:32.690 回答
2

我尝试:

public interface B<T> {
    T getObject();

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

在 Eclipse Indigo Service Release 2 上,没有警告或错误

于 2012-04-04T13:22:09.693 回答
0

<T>只是删除返回类型前面的泛型删除了警告。

这是较早的代码:

private <T> LocalDate convertToDate(Root<T> root, String name, String value) {
    ..........
    ..........
    return LocalDate.parse(value, dtf);
}

警告消失在下面

private LocalDate convertToDate(Root<T> root, String name, String value) {
    ..........
    ..........
    return LocalDate.parse(value, dtf);
}
于 2020-04-07T16:03:47.553 回答