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