使用泛型声明和分配数组

时间:2017-02-25 23:09:17

标签: java generics

我试图在使用泛型时声明并分配一个数组,而且我对此有点麻烦。我注意到通常使用泛型来分配数组是不可能的。我发现这个工作,但它似乎并不适合我。一旦到达Array.newInstance(c,capacity),它就会输出NullPointerException。我只是希望这段代码能够声明数组。任何想法为什么它不会按预期的方式运作?

public class MyHeap<T extends Comparable<T>> implements Heap<T> {
Class<T> type;
T[] heap;
int size;
int capacity;


MyHeap(int x){
    capacity = x;
    size = 0;
    arraySet(type, capacity);
}

private void arraySet(Class<T> c, int capacity){
    @SuppressWarnings("unchecked")
    final T[] heap = (T[]) Array.newInstance(c, capacity);
    this.heap = heap;
}

}

1 个答案:

答案 0 :(得分:0)

解决根本问题:

  

...但我不明白是什么课?如何设置值?

您的选择是:

  1. 将其作为参数传递给构造函数:

    MyHeap (int x, Class<T> type) { this.type = type; ... }
    
    // Usage
    new MyHeap(64, Integer.class);
    
  2. 将那种类型的内容传递给构造函数(不适合您的情况)并使用其类型信息:

    MyHeap (int x, T obj) { this.type = obj.getClass(); ... }
    
    // Usage
    new MyHeap(64, new Integer());
    

    List#toArray(T[])为此目的使用此模式。

  3. 只需在内部存储Object数组(Object[] heap),就可以在创建数组时使用该类型。 ArrayList is implemented this way,只要在函数参数列表中使用T,编译器就会验证一切都很酷。对于T返回类型,您必须在返回它们之前将对象强制转换为Texample),但只要您拥有每个Object的不变量。 } s是T,然后它将永远是一个安全的演员。

  4. 我会使用选项3,因为它会导致最简单的API。