Java/泛型/ClassCastException

标签 java generics classcastexception

我有一个LinkedList<T>其中包含 Object toArray()方法:

public Object[] toArray()
{

    Object[] array = new Object[size];

    int c=0;
    for(Node<T> i = first;i != null;i=i.next)
    {
        array[c++] = i.data;
    }

    return array;
}

我想用通用方法对我的 LinkedList 进行排序:<T extends Comparable> void sort (List<T> list) 。要对列表进行排序,我必须在此方法中将它们表示为数组:

T[] elements = (T[])list.toArray();`

但是,我得到ClassCastException在这一行,我不知道为什么。由于该方法的泛型类型相当于返回数组中元素的运行时类型,因此这种转换不是谎言!

最佳答案

toArray() 返回Object[]。类型信息丢失,并且无法将其强制转换回 T[]。如果您想保留类型信息,可以使用以下内容。然后,您为该方法提供一个预定义的数组,该数组将被填充。如果您不提供任何内容 - toArray 将创建一个新的 Object[]

T[] elements = list.toArray(new T[list.size()]);

只是填充一个数组(另一种写作风格):

T[] elements = new T[list.size()];
list.toArray(elements);

或者如果您使用 Java 8:

T[] elements = list.stream().toArray(T[]::new);

关于Java/泛型/ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35241787/

相关文章:

java - 查询具有相同字符串的所有行(但给出了部分字符串)

java - 计算通过 JUnit 调用函数的次数

java - 为什么在java中创建连接成本太高

java - 为什么Java在读取LinkedHashMap时会自动从String转换为Integer

java - 未使用类的 ClassCastException?

Java 泛型和 Hadoop : how to get a class variable

swift - 升级到 iOS 12.2 (Xcode 10.2) 后 Swift 4.2 中的奇怪泛型和可选行为

java - 从一个 obj 传递到另一个 obj 的通用参数

java - 在 Swagger 中使用泛型处理特殊情况

带有监听器的 Android Broadcastreceiver