Java/Generics/ClassCastException
我有一个Java/Generics/ClassCastException,java,generics,classcastexception,Java,Generics,Classcastexception,我有一个链接列表,其中包含对象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; } 然而,我在这一行得到了ClassCastExcep
链接列表
,其中包含对象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;
}
然而,我在这一行得到了
ClassCastException
,我不知道为什么。由于方法的泛型类型相当于返回数组中元素的运行时类型,因此此强制转换不是谎言 您应该使用T[]toArray(新的T[list.size()])
。无需强制转换。您应该使用T[]toArray(新的T[list.size()])
。无需强制转换。toArray()
返回对象[]
。类型信息丢失,您无法将其强制转换回t[]。如果要保留类型信息,可以使用以下命令。然后给该方法一个预定义的数组,该数组被填充。如果你不给任何东西-toArray
将创建一个新的对象[]
T[] elements = list.toArray(new T[list.size()]);
仅填充数组(另一种书写方式):
或者,如果您使用Java 8:
T[] elements = list.stream().toArray(T[]::new);
toArray()
返回对象[]
。类型信息丢失,您无法将其强制转换回t[]。如果要保留类型信息,可以使用以下命令。然后给该方法一个预定义的数组,该数组被填充。如果你不给任何东西-toArray
将创建一个新的对象[]
T[] elements = list.toArray(new T[list.size()]);
仅填充数组(另一种书写方式):
或者,如果您使用Java 8:
T[] elements = list.stream().toArray(T[]::new);
方法
LinkedList.toArray()
创建一个类型为Object[]
的新数组。它不会创建类型为T[]
的新数组。这很重要,因为即使数组只包含T
的实例,也不能将数组分配给T[]
类型的变量,因为数组本身具有类型对象[]
。您可以使用以下代码重现此错误:
String[] array = (String[]) new Object[0];
如果我理解正确,您希望将列表转换为数组,以便能够实现自己的搜索功能。给定一个
列表
,其中包含T
类型的元素,您希望将此列表转换为T[]
类型的数组。但是,您不能简单地调用newt[list.size()]
,因为Java在编译时会丢失泛型类型信息。要创建正确类型的数组,需要使用反射方法
以下是一个例子:
@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
}
@SuppressWarnings(“未选中”)
私有无效排序(列表、类类别){
T[]array=list.toArray((T[])array.newInstance(clazz,list.size());
//排序数组并将结果写入列表
}
下面是用法:
List<String> list = new LinkedList<String>();
// populate the list
sort(list, String.class);
System.out.println(list); // -> the sorted list
List List=newlinkedlist();
//填充列表
排序(列表、字符串、类);
System.out.println(列表);//->已排序的列表
方法LinkedList.toArray()
创建一个类型为对象[]的新数组。
。它不会创建类型为T[]
的新数组。这很重要,因为即使数组只包含T
的实例,也不能将数组分配给T[]
类型的变量,因为数组本身具有类型对象[]
。您可以使用以下代码重现此错误:
String[] array = (String[]) new Object[0];
如果我理解正确,您希望将列表转换为数组,以便能够实现自己的搜索功能。给定一个
列表
,其中包含T
类型的元素,您希望将此列表转换为T[]
类型的数组。但是,您不能简单地调用newt[list.size()]
,因为Java在编译时会丢失泛型类型信息。要创建正确类型的数组,需要使用反射方法
以下是一个例子:
@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
}
@SuppressWarnings(“未选中”)
私有无效排序(列表、类类别){
T[]array=list.toArray((T[])array.newInstance(clazz,list.size());
//排序数组并将结果写入列表
}
下面是用法:
List<String> list = new LinkedList<String>();
// populate the list
sort(list, String.class);
System.out.println(list); // -> the sorted list
List List=newlinkedlist();
//填充列表
排序(列表、字符串、类);
System.out.println(列表);//->已排序的列表
您能提供更多的代码吗?很难说像这样的东西List#toArray()
返回Object[]
,而不是T[]
(数组保留其元素的类型,在本例中是Object
)。若要对列表进行排序,请使用Collections.sort(list)
,或在toArray(T[]destination)
中提供T[]
,为什么不使用java.util.Collections对列表进行排序而不将其更改为数组呢?很难说像这样的东西List#toArray()
返回Object[]
,而不是T[]
(数组保留其元素的类型,在本例中是Object
)。要对列表进行排序,请使用Collections.sort(list)
,或在toArray(T[]destination)
中提供T[]
,为什么不使用java.util.Collections对列表进行排序而不将其更改为数组呢?@BenyBosko因为T[]“Object
s的数组”。没有应用类型擦除。但我认为返回数组中的基础类型是t而不是Object!抱歉,它不清楚。@BenyBosko这种方法出现在泛型出现之前很久,当时List
只是List
。现在无法将返回类型更改为t[]
因为向后兼容。@BenyBosko因为T[]
是“Ts的数组”,而不是“对象的数组”s“.Type erasure未应用。但我认为基础类型是t,而不是返回数组中的Object!”!抱歉,不清楚。@BenyBosko这种方法出现在泛型出现之前很久,当时List
只是List
。由于向后兼容,现在无法将返回类型更改为T[]