Java 用泛型声明和分配数组

Java 用泛型声明和分配数组,java,generics,Java,Generics,我试图在使用泛型时声明和分配数组,但在这方面遇到了一些问题。我注意到,通常使用泛型分配数组是不可能的。我找到了这项工作,但似乎对我不起作用。一旦到达Array.newInstance(c,capacity),它就会输出一个NullPointerException。我只是希望这段代码声明数组。你知道为什么它不能按预期的方式工作吗 public class MyHeap<T extends Comparable<T>> implements Heap<T> { C

我试图在使用泛型时声明和分配数组,但在这方面遇到了一些问题。我注意到,通常使用泛型分配数组是不可能的。我找到了这项工作,但似乎对我不起作用。一旦到达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;
}
公共类MyHeap实现Heap{
班级类型;
T[]堆;
整数大小;
国际能力;
MyHeap(intx){
容量=x;
尺寸=0;
阵列集(类型、容量);
}
专用void阵列集(c类,内部容量){
@抑制警告(“未选中”)
最终的T[]堆=(T[])数组;
this.heap=堆;
}

}解决您的根本问题:

…但我不明白什么是阶级?如何设置该值

你的选择是:

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

    MyHeap (int x, Class<T> type) { this.type = type; ... }
    
    // Usage
    new MyHeap(64, Integer.class);
    
    为此目的使用此模式

  • 只需在内部存储一个
    对象
    数组(
    对象[]堆
    ),就不必在创建数组时使用该类型,只要在函数参数列表中使用
    T
    ,编译器就会验证一切是否正常。对于
    T
    返回类型,您必须在返回对象()之前将对象强制转换为
    T
    ,但只要您具有每个
    对象
    都是
    T
    的不变量,那么它将始终是一个安全强制转换


  • 我会选择选项3,因为它会导致最简单的API。

    因为
    type
    null
    。您可以使用
    列表
    ,这样就不需要引用组件类型。噢!我没有意识到这一点。但我该怎么设置呢。不幸的是,我必须是一个数组。我这样做是作为我的数据结构和算法类实验室的一部分,它要求该实现使用阵列,而不仅仅是使用
    可比[]
    ?您已经知道它的组件类型:
    Comparable
    。有关创建泛型数组的信息,请参阅:我使用了该链接,但我不明白什么是类?如何设置该值?
    MyHeap (int x, T obj) { this.type = obj.getClass(); ... }
    
    // Usage
    new MyHeap(64, new Integer());