【问题标题】:Generic class constructor failing with a class cast exception error at runtime通用类构造函数在运行时因类转换异常错误而失败
【发布时间】:2013-12-08 09:38:39
【问题描述】:

我正在尝试创建自己的通用链表数据类型,但在构造函数时遇到了问题,并且遇到了类转换异常。有谁知道如何解决这个问题以及为什么会这样?

这是我的相关代码:

public class SinglyLinkedList<E> {

   private LinkedListNode<E>[] linkedListNodeList;

   public SinglyLinkedList()
   {
       linkedListNodeList = (SinglyLinkedListNode<E>[]) new Object[10];
   }

}

违规行是构造函数中的实现行。

这是我的 SingleLinkedListNode 类:

public class SinglyLinkedListNode<E> extends LinkedListNode<E>{

   private E data;

   public SinglyLinkedListNode(E data)
   {
       this.data = data;
   }
}

而我的 LinkedListNode 类只是 SinglyLinkedListNode 扩展的空(目前)抽象类。

这是我收到的编译器错误:

java.lang.ClassCastException: [Ljava.lang.Object;不能转换为 [LabstractDataTypes.SinglyLinkedListNode; 在 abstractDataTypes.SinglyLinkedList.(SinglyLinkedList.java:23)

【问题讨论】:

  • new Object[10] 的类型是Object[]。这不是SinglyLinkedListNode&lt;E&gt;[]。将对象转换为类型不会更改对象的类型。你不能把汽车投给鸟,然后希望汽车把自己变成鸟。如果动物实际上是鸟,您可以将动物施放给鸟。也就是说,为什么需要链表中的节点数组?你了解什么是链表吗?

标签: java generics


【解决方案1】:

Object[] 与任何其他数组都不兼容(例如 String[])。但这会起作用:

public class SinglyLinkedList<E> {

   private LinkedListNode<E>[] linkedListNodeList;

   public SinglyLinkedList()
   {
       linkedListNodeList = (SinglyLinkedListNode<E>[]) new SinglyLinkedListNode<?>[10];
   }
}

请注意,也不能使用new SinglyLinkedListNode&lt;E&gt;[10],因为一般无法创建通用数组:

E[] myArray = new E[10]; // doesn't work, if E is a generic type parameter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2019-05-12
    相关资源
    最近更新 更多