首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java / Generics / ClassCastException

Java / Generics / ClassCastException
EN

Stack Overflow用户
提问于 2016-02-06 13:51:12
回答 3查看 551关注 0票数 0

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

代码语言:javascript
复制
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)进行排序。要对列表进行排序,我必须在此方法中将它们表示为数组:

代码语言:javascript
复制
T[] elements = (T[])list.toArray();`

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-06 14:11:52

toArray()返回Object[]。类型信息丢失,不能将其转换回T[]。如果要保留类型信息,可以使用以下内容。然后,给出一个预先定义的数组,然后填充该数组。如果你什么都不给- toArray会创建一个新的Object[]

代码语言:javascript
复制
T[] elements = list.toArray(new T[list.size()]);

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

代码语言:javascript
复制
T[] elements = new T[list.size()];
list.toArray(elements);

或者如果您使用Java 8:

代码语言:javascript
复制
T[] elements = list.stream().toArray(T[]::new);
票数 2
EN

Stack Overflow用户

发布于 2016-02-06 14:12:34

方法LinkedList.toArray()创建一个类型为Object[]的新数组。它不创建T[]类型的新数组。这一点很重要,因为即使数组只包含T的实例,也不能将数组分配给T[]类型的变量,因为数组本身具有Object[]类型。您可以使用以下代码再现此错误:

代码语言:javascript
复制
String[] array = (String[]) new Object[0];

如果我正确地理解了您,您希望将列表转换为数组,以便能够实现您自己的搜索功能。给定一个List<T>,它包含要将此列表转换为类型T[]的数组的T类型的元素。但是,您不能简单地调用new T[list.size()],因为Java在编译时会松散泛型类型信息。要创建正确类型的数组,需要使用反射方法Array.newInstance()

下面是一个示例:

代码语言:javascript
复制
@SuppressWarnings("unchecked")
private <T extends Comparable<T>> void sort(List<T> list, Class<T> clazz) {
    T[] array = list.toArray((T[]) Array.newInstance(clazz, list.size()));
    // sort array and write result to the list
}

这里的用法:

代码语言:javascript
复制
    List<String> list = new LinkedList<String>();
    // populate the list
    sort(list, String.class);
    System.out.println(list); // -> the sorted list
票数 2
EN

Stack Overflow用户

发布于 2016-02-06 14:00:43

您应该使用T[] toArray(new T[list.size()])代替。没必要投。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35241787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档