Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用泛型类型参数调用方法时出现问题_Java_Eclipse_Generics - Fatal编程技术网

Java 使用泛型类型参数调用方法时出现问题

Java 使用泛型类型参数调用方法时出现问题,java,eclipse,generics,Java,Eclipse,Generics,我对泛型有一些问题,让我解释一下 我有一个包装LinkedList的类: public class IdnList<T extends Numerable> extends IdnElement implements List<T> { private LinkedList<T> linkedList; @Override public boolean add(T e){ return linkedList.add(e

我对泛型有一些问题,让我解释一下

我有一个包装LinkedList的类:

public class IdnList<T extends Numerable> extends IdnElement implements List<T> {

    private LinkedList<T> linkedList;

    @Override
    public boolean add(T e){
       return linkedList.add(e);
    }

   //stuff  
}
但是eclipse说:
类型IdnList中的add(capture#1-of?)方法不适用于参数(Numerable)
,我真的不明白为什么它不能工作。为什么我不能在列表中添加一个
Numerable
对象? 我错过了什么

编辑: 这是一部经典之作。你问了,然后你找到了线索。解决办法似乎是:

  ((IdnList<Numerable>)this).add((Numerable)childToAdd);
((IdnList)this.add((Numerable)childToAdd);

但我不知道它有多优雅。我真的很感谢您的进一步评论。

假设您有
A
B
类,它们都扩展了
可数
。然后有三种有效的
IdnList
IdnList
IdnList
,和
IdnList

我希望您同意,您不应该在
IdnList
中添加任何
Numerable

现在,在这行代码中,编译器如何知道您是否正确匹配了类型

(IdnList<?>)this).add((Numerable)childToAdd);
(IdnList)this)。添加((可数)childToAdd);
它只知道
childToAdd
是一个
Numerable
,而
this
是某种
IdnList
。它不知道是什么类型的,所以不能保证类型安全。请记住,泛型类型检查完全在编译时完成,而不是在运行时完成


我看到了变通方法是如何允许代码编译的,但我不确定它的风险是什么。在我看来,由于泛型类型参数在运行时被擦除,因此基本上您只是绕过了此处的所有类型检查。

问题在于对其他类中IdnList实例的引用。 我无法在您的代码示例中看到它,但它似乎没有与之关联的正确类型,尤其是当它被转换为通配符时

由于IdnList要求每个实例都有一个类型(T)集,因此编译器无法知道您要做什么

如果您对IdnList的引用具有与其关联的正确类型,则它将接受T的任何子类,如下所示:

  IdnList<Numerable> list = new IdnList<Numerable>();
  list.add(new Numerable());
  list.add(new AnotherType());
  list.add(new YetAnotherType());
IdnList list=new IdnList();
list.add(新的Numerable());
添加(新的其他类型());
添加(新的YetAnotherType());
(假设AnotherType和YetAnotherType是Numerable的子类)

由于对实例的引用未设置任何类型,我猜您实际要做的是:

public class IdnList extends IdnElement implements List<Numerable> {

    private LinkedList<Numerable> linkedList;

    @Override
    public boolean add(Numerable e) {
        return linkedList.add(e);
    }
}
公共类IdnList扩展了IDNEElement实现列表{
私有链接列表链接列表;
@凌驾
公共布尔加法(可数e){
返回linkedList.add(e);
}
}

这是什么(什么类别声明)?哎呀,对不起。这是一个
idneElement
。好的,我明白你的意思。但是考虑到我不想声明IdnList的类型(我正在使用反射,我希望保持通用性),似乎我没有优雅的方法来解决我的问题。
public class IdnList extends IdnElement implements List<Numerable> {

    private LinkedList<Numerable> linkedList;

    @Override
    public boolean add(Numerable e) {
        return linkedList.add(e);
    }
}