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
Erm),有没有想过如果您在一堆(比如)字符串对象中运行此代码会发生什么 在您实际实例化泛型类之前,T是不存在的。因此,如果您不知道T是什么,那么创建带有整数的T数组是没有意义的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
编辑:同样,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
这样的基本类型不能用作泛型类型参数-它必须是引用类型,likeInteger
。因此您可以将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--){
...
}