gpt4 book ai didi

java - 编译器忽略的泛型类型

转载 作者:行者123 更新时间:2023-12-04 00:51:38 25 4
gpt4 key购买 nike

最近我偶然发现了一种泛型的边缘情况,这似乎不合逻辑。

我有一个简单的界面,它返回子项列表:

public interface INode<C extends INode> {

List<C> getChildren();

}

我希望如果在没有定义 C 类型的情况下引用 INode 类型,编译器会将 C 类型推断为 INode。换句话说,在下面的代码中:

    public void retrieveChildren(INode node)  {

var children = node.getChildren();

}

List<INode> 开始将推断出子类型。相反,它只是简单的列表。

值得注意的是,类型推断按预期工作,INode 方法返回单个元素,因此当此接口(interface)时:

public interface INode<C extends INode> {

C getFirstChild();

}

用于以下方法:

    public void retrieveFirstChild(INode node)  {

var firstChild = node.getFirstChild();

}

firstChild 被正确推断为 INode。

jdk 这样工作有什么理由吗?另外,是否有一种干净的方法来强制返回列表的 C 类型?

非常感谢。

最佳答案

children would be inferred as of List< INode> type. Instead, it's just plain List.

一旦你使用原始类型,它就会感染一切。 INode 具有 typeargs,并且在您的签名 (retrieveFirstChild) 中,您可以原始使用它,这意味着涉及该变量的任何泛型的所有交互也是原始的。

解决方案是永远不要使用 raw(编译器会发出警告,您应该注意这些警告!):

public void retrieveFirstChild(INode<?> node) {
// note the <?> up there!
var firstChild = node.getFirstChild();
}

现在,firstChild 的类型是 INode,正如预期的那样。

关于java - 编译器忽略的泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65959374/

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