Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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泛型:数组转换_Java_Arrays_Generics_Casting - Fatal编程技术网

Java泛型:数组转换

Java泛型:数组转换,java,arrays,generics,casting,Java,Arrays,Generics,Casting,我想强制转换一个包含泛型类型的对象数组,以供严格的内部使用 对象: private class Node<T> { T element; int prior; public Node(T element, int prior) { this.element=element; this.prior=prior; } } private Node<E>[] elements; public Pr

我想强制转换一个包含泛型类型的对象数组,以供严格的内部使用


对象:

private class Node<T>
{
    T element;
    int prior;

    public Node(T element, int prior)
    {
        this.element=element;
        this.prior=prior;
    }

}
private Node<E>[] elements;
public PriorityQueue()
{   
  elements = (Node<E>[])new Object[capacity]; // ClassCastException
}
私有类节点
{
T元素;
int-prior;
公共节点(T元素,int优先)
{
这个元素=元素;
这个。先验=先验;
}
}
数组:

private class Node<T>
{
    T element;
    int prior;

    public Node(T element, int prior)
    {
        this.element=element;
        this.prior=prior;
    }

}
private Node<E>[] elements;
public PriorityQueue()
{   
  elements = (Node<E>[])new Object[capacity]; // ClassCastException
}
私有节点[]元素;
演员阵容:

private class Node<T>
{
    T element;
    int prior;

    public Node(T element, int prior)
    {
        this.element=element;
        this.prior=prior;
    }

}
private Node<E>[] elements;
public PriorityQueue()
{   
  elements = (Node<E>[])new Object[capacity]; // ClassCastException
}
public PriorityQueue()
{   
elements=(节点[])新对象[capacity];//ClassCastException
}


为什么我会得到ClassCastException?

这里接受的解决方案应该起到以下作用:


不能直接将对象[]强制转换为节点[],但可以使用Arrays.copyOf()创建正确类型的副本。唯一的缺点是这涉及到复制,但它是Java:如果您希望它不会太慢,您就不会对自己这样做;)

强制转换不起作用的原因是
节点
的类型擦除适用于
节点
内部的
E
,但不适用于
节点
的数组

类型擦除将允许您将
节点
强制转换为
节点
,因为所有
节点
都在引擎盖下。类似地,它将允许您将
节点[]
转换为
节点[]
并返回,因为数组共享相同的底层类型,即
节点

但是,在处理数组时,类型擦除不起作用。对象数组仍然是对象数组,Java有足够的元数据来了解它

您有几种解决此问题的方法:

  • 节点[]
    切换到
    阵列列表
    -阵列列表具有相似的占用空间和访问时间,是通用的
  • 使用来自的解决方案-类型安全解决方案需要通过
    Class

因为对象[]不是节点[]。实际上,Arrays.copyOf使用使用本机代码的Sytsem.arraycopy。此外,java在性能方面与C接近:是的,拷贝会很便宜,因为arraycopy并不糟糕(尽管它会有边界检查,这是很小的开销)。另一方面,我们需要这个副本的唯一原因是因为Java的类型系统中存在缺陷。