我试图在使用泛型时声明并分配一个数组,而且我对此有点麻烦。我注意到通常使用泛型来分配数组是不可能的。我发现这个工作,但它似乎并不适合我。一旦到达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;
}
}
答案 0 :(得分:0)
解决根本问题:
...但我不明白是什么课?如何设置值?
您的选择是:
将其作为参数传递给构造函数:
MyHeap (int x, Class<T> type) { this.type = type; ... }
// Usage
new MyHeap(64, Integer.class);
将那种类型的内容传递给构造函数(不适合您的情况)并使用其类型信息:
MyHeap (int x, T obj) { this.type = obj.getClass(); ... }
// Usage
new MyHeap(64, new Integer());
List#toArray(T[])
为此目的使用此模式。
只需在内部存储Object
数组(Object[] heap
),就可以在创建数组时使用该类型。 ArrayList
is implemented this way,只要在函数参数列表中使用T
,编译器就会验证一切都很酷。对于T
返回类型,您必须在返回它们之前将对象强制转换为T
(example),但只要您拥有每个Object
的不变量。 } s是T
,然后它将永远是一个安全的演员。
我会使用选项3,因为它会导致最简单的API。