gpt4 book ai didi

java - Java 中的显式对象转换

转载 作者:行者123 更新时间:2023-12-01 16:53:36 24 4
gpt4 key购买 nike

我对 Java 比较陌生,所以才有这个问题。 Java 为什么要强制转换对象,以及当对象被强制转换时编译器到底发生了什么。这是我的简单级别顺序搜索代码。

void LevelOrder(Node root)
{
Queue<Node> Q = new LinkedList();
Q.add(root);
while(!Q.isEmpty()){
Node p = Q.poll();
System.out.print(p.data+ " ");
if(p.left != null) Q.add(p.left);
if(p.right != null) Q.add(p.right);
}


}

当我在 hackerrank 提供的基于 Web 的 IDE 上运行此代码时,它会进行编译,但会给出以下警告。

Note: Solution.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

当我通过将 poll 行更改为此来转换节点对象时,

Node p = (Node)Q.poll();

它仍然编译并显示相同的警告。

然而,在我的 IntelliJ IDE 上,第一个代码甚至无法编译,只有第二个代码(使用显式转换)可以编译。

有人能准确解释一下这里发生了什么吗?除了解决错误之外,有人可以解释一下为什么一个编译器允许这一行编译,而另一个编译器在没有显式转换的情况下不允许编译。

Node p = Q.poll();

最佳答案

new LinkedList();

这是一个raw-typed集合 - 编译器不知道其中的元素是什么类型(即使其中实际上什么都没有)。

因此,当您尝试将其分配给只能包含 Node 类型元素的引用时:

Queue<Node> Q = new LinkedList();

那么编译器就无法知道这是否安全。

修复很简单:告诉编译器元素的类型:

Queue<Node> Q = new LinkedList<Node>();

在 Java 7+ 中它甚至可以更简单:

Queue<Node> Q = new LinkedList<>();

在这种情况下,编译器将类型推断为 <Node><>被称为“钻石符号”;它不能在所有情况下使用,但可以在像这样的赋值上下文中使用。

关于java - Java 中的显式对象转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35802060/

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