泛型类中的java泛型转换

and*_*dge 2 java generics casting

我正在编写一个通用最大堆的简单实现.如果我写

public class FastMaxHeap<T>{

  T[] data;
  int size;

  static final int HEAP_SIZE = 10000;

  @SuppressWarnings("unchecked")
  public FastMaxHeap(){
    data = (T[]) new Object[HEAP_SIZE];
  size = 0;
  }
}
Run Code Online (Sandbox Code Playgroud)

它汇编.现在要实际实现堆,即写入maxHeapify(),我需要能够比较两个T.先验似乎可能的一个选择是告诉编译器T实现Comparable.但是,如果我用<T implements Comparable>键入replace <T>,编译器会抱怨 - 我该怎么做?

或者,我可以定义一个类

public class HasValue{

  int value;

  public HasValue(int value){
        this.value = value;
  }
Run Code Online (Sandbox Code Playgroud)

}

理论上我应该能够比较两个HasValue对象,如x.value> y.value.但如果我输入

public class FastMaxHeap<T extends HasValue>{

  T[] data;
  int size;

  static final int HEAP_SIZE = 10000;

  @SuppressWarnings("unchecked")
  public FastMaxHeap(){
    data = (T[]) new Object[HEAP_SIZE];
  size = 0;
  }
}
Run Code Online (Sandbox Code Playgroud)

我现在得到一个ClassCastException.这里发生了什么?Java泛型伤害了我的大脑.

Pet*_*rey 5

在第一种情况下T extends Object,它Object在运行时被删除.

在第二种情况下T extends HasValue被删除,HasValue所以你需要.

data = (T[]) new HasValue[HEAP_SIZE];
Run Code Online (Sandbox Code Playgroud)

恕我直言,Java new T[HEAP_SIZE]无论如何都不允许做你必须做的事情.