繁体   English   中英

创建一个通用类型的数组

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM