gpt4 book ai didi

java - 为什么这个不会投?

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

所以我有一个类:

public static class AVLTreeNode <E extends Comparable<E>> extends BST.TreeNode<E> {
protected int height;

public AVLTreeNode(E e) {
super(e);
}
}

扩展了另一个类:

public static class TreeNode<E extends Comparable<E>> {
protected E element;
protected TreeNode<E> left;
protected TreeNode<E> right;

public TreeNode(E e) {
element = e;
}
}

我正在创建一个 ArrayList类型 TreeNode ,并尝试将其转换到 AVLTreeNode :

public void balancePath(E e) {
ArrayList<TreeNode<E>> path = path(e);
for (int i = path.size() - 1; i >= 0; i--) {
AVLTreeNode<E> a = (AVLTreeNode<E>)(path.get(i));
//continued code not important...

请注意,我的路径方法返回 ArrayList类型 TreeNode<E> 。但是当我尝试将列表中位置 i 处的节点转换为 AVLTreeNode<E> 时( TreeNode 的子类型)我得到 ClassCastException .

这里有什么问题吗?

编辑这是完整的堆栈跟踪

Exception in thread "main" java.lang.ClassCastException: com.jeffsite.chapter27.BinarySearchTree$TreeNode cannot be cast to com.jeffsite.chapter29.AVLTree$AVLTreeNode
at com.jeffsite.chapter29.AVLTree.balancePath(AVLTree.java:102)
at com.jeffsite.chapter29.AVLTree.insert(AVLTree.java:19)
at com.jeffsite.chapter29.TestAVLTree.main(TestAVLTree.java:10)

最佳答案

强制转换并不是一件安全的事情,因为每个 AVLTreeNode 确实是一个 TreeNode,但不一定每个 TreeNode 是一个 AVLTreeNode。您可以通过更改 List 仅保存 AVLTreeNode(s),从

ArrayList<TreeNode<E>> path = path(e);

List<AVLTreeNode<E>> path = path(e);

但是我应该对接口(interface)进行编程(这就是为什么使用List而不是ArrayList),所以我认为你真的想要

List<TreeNode<E>> path = path(e);

然后你就可以使用

TreeNode<E> a = path.get(i);

如果你一定要知道

if (a instanceof AVLTreeNode) {
// now you can cast a
AVLTreeNode<E> b = (AVLTreeNode<E>) a;
}

关于java - 为什么这个不会投?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27264255/

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