Java 将类型对象强制转换为泛型
我知道这是一个非常草率的快速排序,但它是我必须使用的 我的问题是如何在线Java 将类型对象强制转换为泛型,java,generics,casting,quicksort,Java,Generics,Casting,Quicksort,我知道这是一个非常草率的快速排序,但它是我必须使用的 我的问题是如何在线x[k+i]=(E)(y[k])上将y数组的类型更改为E。我目前的做法并没有将对象强制转换为类型E。快速排序工作得很好(至少在递归之前),这只是此时的强制转换 public class quicksort { static <E extends Comparable<E>> E[] quickSort(E[] x, int i, int j) { int pivot = 0;
x[k+i]=(E)(y[k])
上将y
数组的类型更改为E
。我目前的做法并没有将对象强制转换为类型E
。快速排序工作得很好(至少在递归之前),这只是此时的强制转换
public class quicksort {
static <E extends Comparable<E>> E[] quickSort(E[] x, int i, int j) {
int pivot = 0;
Object[] y = new Object[j - i + 1];
for (int k = 0; k < y.length; k++) y[k] = x[k + i];
int lput = i;
int rput = j;
for (int k = i + 1; k <= j; k++) {
if (x[k].compareTo(x[pivot]) < 0) {
y[(lput++) - i] = x[k];
} else {
y[(rput--) - i] = x[k];
}
}
pivot = lput;
y[lput - i] = pivot;
for (int k = 0; k < y.length; k++)
x[k + i] = (E) (y[k]); // this line
quickSort(x, i, pivot - 1);
quickSort(x, pivot + 1, j);
System.out.println("got here");
return x;
}
}
您可以通过传递一个,然后可以使用它创建一个使用JDK工厂方法的类型化的实例:
static <E extends Comparable<E>> E[] quickSort(Class<E> clazz, E[] x, int i, int j) {
E[] y = (E[]) Array.newInstance(clazz, j - i + 1);
...
}
静态E[]快速排序(类clazz,E[]x,inti,intj){
E[]y=(E[])Array.newInstance(clazz,j-i+1);
...
}
你所拥有的已经是最正确的方法了。它编译并运行良好
另一种方法是将数组创建为:
E[] y = (E[])new Comparable[j - i + 1];
然后当你把它拿出来的时候,你就不用扔了:
x[k + i] = (E) (y[k]);
但是,这有点危险,因为指向
y
的对象的实际运行时类是可比较的[]
,而不是E[]
,如果您意外地将y
作为类型E[]
暴露在方法外部,则可能会导致其他代码段中的崩溃,这是意外的。在这种方法中,您没有将y
暴露在方法的外部,因此在这种情况下不会导致任何问题。它如何不精确地工作?你有错误吗?我有一个类型不匹配,无法将对象转换为类型Eth,这是-y
是一个对象
数组,而不是E
数组。尝试改用集合
。对象不是Comparable的子类型,因此编译器无法为您强制转换,我想发布异常的完整堆栈跟踪。告诉我们它指的是哪一行。请注意,您在此处将int存储到对象数组中:y[lput-i]=pivot
。这肯定是错误的。我很想知道为什么ppl不喜欢这个答案。它编译并解决了这个问题。
x[k + i] = (E) (y[k]);