Java 使用泛型类型参数调用方法时出现问题
我对泛型有一些问题,让我解释一下 我有一个包装LinkedList的类: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
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);
}
}