Java泛型转换类型不匹配 公共类MaxHeap实现Heap{ 私有T[]堆; 私有索引; 公共void main(字符串[]参数){ int i; T[]arr={1,3,4,5,2};//此处有错误******* 福 } 公共T[]堆口(T[]阵列,int n){ //构建初始堆 T[]Darray=无阵列; 对于(int i=n-1;i

Java泛型转换类型不匹配 公共类MaxHeap实现Heap{ 私有T[]堆; 私有索引; 公共void main(字符串[]参数){ int i; T[]arr={1,3,4,5,2};//此处有错误******* 福 } 公共T[]堆口(T[]阵列,int n){ //构建初始堆 T[]Darray=无阵列; 对于(int i=n-1;i,java,generics,casting,Java,Generics,Casting,Erm),有没有想过如果您在一堆(比如)字符串对象中运行此代码会发生什么 在您实际实例化泛型类之前,T是不存在的。因此,如果您不知道T是什么,那么创建带有整数的T数组是没有意义的 编辑:同样,Java中的泛型只适用于引用类型,而int是一种值类型。试着改用Integer(int的包装类)。你已经说过T扩展了Comparable“int”不会扩展Comparable,无论你如何转换它。将arr声明为整数[]而不是T[]。我还修复了其他几个小错误: public class MaxHeap<T

Erm),有没有想过如果您在一堆(比如)字符串对象中运行此代码会发生什么

在您实际实例化泛型类之前,T是不存在的。因此,如果您不知道T是什么,那么创建带有整数的T数组是没有意义的


编辑:同样,Java中的泛型只适用于引用类型,而int是一种值类型。试着改用Integer(int的包装类)。

你已经说过
T扩展了Comparable
“int”不会扩展
Comparable
,无论你如何转换它。

arr
声明为
整数[]
而不是
T[]
。我还修复了其他几个小错误:

public class MaxHeap<T extends Comparable<T>> implements Heap<T>{
private T[] heap;
private int lastIndex;

public void main(String[] args){
    int i;
    T[] arr = {1,3,4,5,2}; //ERROR HERE *******
    foo
}

public T[] Heapsort(T[]anArray, int n){
    // build initial heap
    T[]sortedArray = anArray;
    for (int i = n-1; i< 0; i--){
        //assert: the tree rooted at index is a semiheap
        heapRebuild(anArray, i, n);
        //assert: the tree rooted at index is a heap
    }
    //sort the heap array
    int last = n-1;
    //invariant: Array[0..last] is a heap,
    //Array[last+1..n-1] is sorted
    for (int j=1; j<n-1;j++) {
        sortedArray[0]=sortedArray[last];
        last--;
        heapRebuild(anArray, 0, last);
    }
    return sortedArray;
}

protected void heapRebuild(T[ ] items, int root, int size){
foo
}

}
publicstaticvoidmain(字符串[]args){
int i;
整数[]arr={1,3,4,5,2};//此处有错误*******
}
公共T[]堆口(T[]阵列,int n){
//构建初始堆
T[]Darray=无阵列;
对于(int i=n-1;i<0;i--){
//断言:以索引为根的树是一个半堆
heapRebuild(anArray,i,n);
//断言:以索引为根的树是一个堆
}
//对堆数组进行排序
int last=n-1;
//不变量:数组[0..last]是一个堆,
//数组[last+1..n-1]已排序

对于(int j=1;j使用泛型类型时,必须解析所有类型参数,即告诉编译器要使用哪些具体类型,而不是代码中的占位符
T
。正如其他人已经指出的那样,像
int
这样的基本类型不能用作泛型类型参数-它必须是引用类型,like
Integer
。因此您可以将
main
方法重写为

public static void main(String[] args){
    int i;
    Integer[] arr = {1,3,4,5,2}; //ERROR HERE *******

}

public <T> T[] Heapsort(T[]anArray, int n){
    // build initial heap
    T[]sortedArray = anArray;
    for (int i = n-1; i< 0; i--){
        //assert: the tree rooted at index is a semiheap
        heapRebuild(anArray, i, n);
        //assert: the tree rooted at index is a heap
    }
    //sort the heap array
    int last = n-1;
    //invariant: Array[0..last] is a heap,
    //Array[last+1..n-1] is sorted
    for (int j=1; j<n-1;j++) {
        sortedArray[0]=sortedArray[last];
        last--;
        heapRebuild(anArray, 0, last);
    }
    return sortedArray;
}

protected void heapRebuild(T[ ] items, int root, int size){
   //foo
}

将永远不会执行-循环条件应该是
i>0

我已经这样做了。我只是想显示相关部分。我应该将其包括在问题中吗?我仍然会得到一个错误:“MaxHeap类型中的方法Heapsort(T[],int)不适用于参数(整数[],int)”当main中的Heapsort尝试使用arr时。这会产生什么影响?我没有办法实现我的代码吗?Aggh!当一个错误从一个方法消失时,它会弹出到另一个方法中--保留错误:(错误:“MaxHeap类型中的heapRebuild(T[],int,int)方法不适用于参数(T[],int,int)”在方法Heapsort中,无需将
Heapsort
转换为泛型方法-该类已经是泛型的,因此该方法可以正确地看到
T
类型参数。
public static void main(String[] args){
    int i = 5;
    Integer[] arr = {1,3,4,5,2};
    MaxHeap<Integer> maxHeap = new MaxHeap<Integer>();

    maxHeap.heapSort(arr, i);
}
for (int i = n-1; i< 0; i--){
    ...
}