Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java/Generics/ClassCastException_Java_Generics_Classcastexception - Fatal编程技术网

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[]