gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:02:27 25 4
gpt4 key购买 nike

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

我有一个包装 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) AB两者都扩展了 Numerable .那么 IdnList 的三种有效类型: IdnList<A> , IdnList<B> , 和 IdnList<Numerable> .

我希望您同意您不应该添加任何 NumerableIdnList<A> .

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

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

它只知道 childToAddNumerable , 那this是某种 IdnList .它不知道是什么类型,所以不能保证类型安全。请记住,泛型类型检查完全在编译时完成,而不是运行时。

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

关于java - 使用泛型类型参数调用方法时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9635907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com