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

Java “故障排除”;类型参数T隐藏类型T";警告,java,generics,warnings,Java,Generics,Warnings,我在eclipse(最新版本)中收到了以下代码的警告 public interface A<T> extends B<T> { public T getObject(); } 公共接口A扩展了B{ 公共T getObject(); } 警告出现在“A”中的“T”处,内容为:“类型参数T正在隐藏类型T” 奇怪的是,下面的代码没有生成错误或警告 public interface A extends B<T> { public T getOb

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

public interface A<T> extends B<T> {
     public T getObject();
}
公共接口A扩展了B{
公共T getObject();
}
警告出现在“A”中的“T”处,内容为:“类型参数T正在隐藏类型T”

奇怪的是,下面的代码没有生成错误或警告

public interface A extends B<T> {
     public T getObject();
}
公共接口A扩展了B{
公共T getObject();
}
但是现在我不能延伸一段时间来告诉它t是什么类型


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

您是否在某个地方有一个名为
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{//A具体类型T
}
接口B{//警告:类型参数T正在隐藏类型T
}
接口A扩展了B{//警告:类型参数T正在隐藏类型T
T getObject();
}
如果我删除class
T
,它将消失。

我尝试:

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

    public  interface A<T> extends B<T>{
        T getObject();
    }
}
公共接口B{
T getObject();
公共接口A扩展了B{
T getObject();
}
}

在eclipse Indigo Service Release 2上,即使这个问题已经得到了回答,也没有警告或错误,因为主题行是关于(“类型参数T隐藏类型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();
  }
}

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

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

<T> Output<T> doSomething(Input<T> input);
输出剂量测量(输入);
如果您尝试将其覆盖为:

@Override
public <Object> Output<Object> soSomething(Input<Object> input){
    /*..*/
}
@覆盖
公共输出(输入){
/*..*/
}
编译器警告您:

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


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

请重新定义将通用的
移动到返回类型前面会删除警告

这是前面的代码:

private <T> LocalDate convertToDate(Root<T> root, String name, String value) {
    ..........
    ..........
    return LocalDate.parse(value, dtf);
}
private LocalDate convertToDate(根根、字符串名称、字符串值){
..........
..........
返回LocalDate.parse(值,dtf);
}
警告消失在下面

private LocalDate convertToDate(Root<T> root, String name, String value) {
    ..........
    ..........
    return LocalDate.parse(value, dtf);
}
private LocalDate convertToDate(根根、字符串名称、字符串值){
..........
..........
返回LocalDate.parse(值,dtf);
}

就是这样,谢谢!结果是我意外地导入了一个与类型参数同名的类。我取出了导入,效果很好。显然,当内部泛型类重新使用与封闭(也是泛型)相同的类型参数时,也会发生这种情况在我的例子中,Eclipse已经自动导入了
org.apache.poi.ss.formula.functions.T
,这导致了警告。由于答案的显示顺序不是固定的,“last answer”Plaiska的一个我的意思是,如果Eclipse错误消息说
类型参数对象隐藏了java.lang.Object类型,那么它会更清楚/有用
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);
}