- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对泛型有一些疑问,让我解释一下。
我有一个包装 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
}
请注意泛型类型T
本类(class)的extends
Numerable
界面。
好的,现在我想在不同的类中调用这个方法,如下所示:
if(childToAdd instanceof Numerable)
((IdnList<?>)this).add((Numerable)childToAdd);
但是 eclipse 说:The method add(capture#1-of ?) in the type IdnList<capture#1-of ?> is not applicable for the arguments (Numerable)
,我真的想不通为什么它不起作用。为什么我不能添加 Numerable
反对我的名单?我错过了什么?
编辑:这是一个经典。你问,然后你找到了线索。似乎解决方法是:
((IdnList<Numerable>)this).add((Numerable)childToAdd);
但我不知道它有多优雅。我非常感谢进一步的评论。
最佳答案
假设您有类(class) A
和 B
两者都扩展了 Numerable
.那么 IdnList
的三种有效类型: IdnList<A>
, IdnList<B>
, 和 IdnList<Numerable>
.
我希望您同意您不应该添加任何 Numerable
到IdnList<A>
.
现在,在这行代码中,编译器如何知道您是否正确匹配了类型?
(IdnList<?>)this).add((Numerable)childToAdd);
它只知道 childToAdd
是 Numerable
, 那this
是某种 IdnList
.它不知道是什么类型,所以不能保证类型安全。请记住,泛型类型检查完全在编译时完成,而不是运行时。
我看到变通方法如何允许代码编译,但我不确定它的风险是什么。在我看来,由于泛型类型参数在运行时被删除,基本上你只是绕过了这里的所有类型检查。
关于java - 使用泛型类型参数调用方法时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9635907/
我是一名优秀的程序员,十分优秀!