我有一个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,我不知道为什么。由于方法的泛型类型相当于返回数组中元素的运行时类型,因此此强制转换不是谎言!
发布于 2016-02-06 14:11:52
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);发布于 2016-02-06 14:12:34
方法LinkedList.toArray()创建一个类型为Object[]的新数组。它不创建T[]类型的新数组。这一点很重要,因为即使数组只包含T的实例,也不能将数组分配给T[]类型的变量,因为数组本身具有Object[]类型。您可以使用以下代码再现此错误:
String[] array = (String[]) new Object[0];如果我正确地理解了您,您希望将列表转换为数组,以便能够实现您自己的搜索功能。给定一个List<T>,它包含要将此列表转换为类型T[]的数组的T类型的元素。但是,您不能简单地调用new T[list.size()],因为Java在编译时会松散泛型类型信息。要创建正确类型的数组,需要使用反射方法Array.newInstance()。
下面是一个示例:
@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
}这里的用法:
List<String> list = new LinkedList<String>();
// populate the list
sort(list, String.class);
System.out.println(list); // -> the sorted list发布于 2016-02-06 14:00:43
您应该使用T[] toArray(new T[list.size()])代替。没必要投。
https://stackoverflow.com/questions/35241787
复制相似问题