[英]Creating an array of generic type
假设我想通过默认构造函数创建一个长度为5的数组
public class A <E extends Comparable<? super E>> implements B<E>
{
private E[] myArray;
public A()
{
myArray = (E[]) new Object[5];
}
}
这是正确的做法吗? 我很困惑,我是否必须在[]之前陈述“可比较”。 所以
private Comparable[] myArray;
不。 它将在运行时抛出ClassCastException
让我们看看原因。 因为<E extends Comparable<? super E>>
<E extends Comparable<? super E>>
,一旦所有泛型类型被编译器擦除, E
将被类中的Comparable
替换。
因此,在您的构造函数中,这主要是在运行时发生的:
myArray = new Comparable[5];
这是错误的,因此是例外。
它将与class A <E> implements B<E>
所以解决方案是:
class A <E extends Comparable<? super E>> implements B<E>{
Comparable[] array;
public A(){
array = new Comparable[5];
}
@SuppressWarnings("unchecked")
E get(int x)
{
return (E) array[x];
}
void add(E b){
//for now
array[0] = b;
}
您发布的代码的问题是E[]
的擦除是Comparable[]
(因为E
的上限是Comparable
),因此将实际类型为Object[]
为Comparable[]
将失败。
您可以简单地将其更改为以下内容,它不会抛出异常:
public class A <E extends Comparable<? super E>> implements B<E>
{
private E[] myArray;
public A()
{
myArray = (E[]) new Comparable[5];
}
}
但是,这里有更多的细微之处: myArray
实际上不是E[]
类型。 在课堂内, E[]
被删除为Comparable[]
,所以没关系。 但是你必须确保永远不要将myArray
暴露给课外。 由于它是私有的,你只需要确保没有方法返回它或什么。
这样做的好处是,保持myArray
类型为E[]
,而不是Jatin使用Comparable[]
的答案,就是你不必每次从中获取某些内容时都要进行转换,因此代码更好。
正如@Jatin指出的那样,如果将Object
强制转换为Comparable
,则将获得运行时异常,因为它是Comparable
父级,因此无法强制转换为子类型。
我建议你尽可能使用ArrayList
:
例如
public class A <E extends Comparable<? super E>> implements B<E> {
private List<E> myArray;
public A() {
myArray = new ArrayList<E>();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.