【问题标题】:Class Cast Exception generated while using generics in Java在 Java 中使用泛型时生成的 Class Cast 异常
【发布时间】:2013-03-10 17:04:00
【问题描述】:

我正在做家庭作业,但我无法弄清楚为什么每当我尝试运行我的代码时,我总是会收到类强制转换异常。我认为这是由于 (path.get(i)) 但我似乎无法找到解决它的方法。我收到的错误是

 Exception in thread "main" java.lang.ClassCastException: avltreend.BinarySearchTreeND$BSTNodeND cannot be cast to avltreend.AVLtreeND$AVLTreeNode
    at avltreend.AVLtreeND.balancePath(AVLtreeND.java:64)
    at avltreend.AVLtreeND.insert(AVLtreeND.java:27)
    at avltreend.AVLtreeND.TestAVL(AVLtreeND.java:233)
    at avltreend.AVLtreeND.main(AVLtreeND.java:244)
Java Result: 1

部分代码如下

   private void balancePath(K d) {
    ArrayList<BSTNodeND<K>> path = path(d);
    for (int i = path.size() - 1; i>= 0; i--) {
     //   System.out.println(path);
        AVLTreeNode<K> A = (AVLTreeNode<K>)(path.get(i));
        findheight(A);
        AVLTreeNode<K> POA = (A == root) ? null :
                (AVLTreeNode<K>)(path.get(i - 1));

上面的第5行运行时似乎出现了错误。

      class BSTNodeND < L extends Comparable< ? super L > > {
     L data;
     BSTNodeND < L > left, right, parent;

     BSTNodeND (L d)                  {data = d;}
     BSTNodeND (L d, BSTNodeND <L> p) {data = d; parent = p;}

     public String toString () {
        return data.toString();} // end toString method
  } 


   protected class AVLTreeNode<L extends Comparable<? super L>>
      extends BSTNodeND<L> {
    protected int height = 0; // New data field

    public AVLTreeNode(L d) {
      super(d);
    }

这就是 AVLTreeNode 类。

我无法弄清楚为什么这两个类不能一起工作,因为我已经更改了一个工作示例并且它应该可以工作。感谢您提供的任何帮助。

【问题讨论】:

  • 错误可能是您的插入逻辑在创建BSTNodeND 时应该创建AVLTreeNode,但您没有向我们提供该代码。

标签: java generics arraylist avl-tree


【解决方案1】:

您的变量 pathArrayListBSTNodeND。当您获得一个元素时,您正试图将其转换为AVLTreeNode。也就是说,您正在尝试将父类转换为子类,如果您的列表中只有“子”元素,但如果对象的类型是 BSTNodeND,那么您不能将其转换为它的专用子类 @987654326 @。

【讨论】:

  • 非常感谢您的帮助。我能够一起删除 AVLTreeNode,只需向我的 BSTNodeND 添加一个高度参数。不再有流浪儿童!
【解决方案2】:

如果一个对象真正的运行时类型是 A,那么你不能将它强制转换为子类 B。例如,

class A {...}

class B extends A {
    public void announce() { 
        System.out.println("Hi, I'm an instance of B."); 
     }
}

public class Main {
   public static void main(String[] args) {
       A a = new A();
       A b = new B();
       ((B) b).announce(); // Valid
       ((B) a).announce(); // Exception!
   }
}

这正是您正在做的,将BSTNodeND 的实例强制转换为它的子类AVLTreeNode

【讨论】:

    猜你喜欢
    • 2014-10-23
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多