最近在看一个算法课程,老师用的是c++的template和函数指针来完成一个实现,于是我想用java通过反射和泛型来完成,但是出现了问题。
希望通过java反射以及泛型来实现动态测试SortClass中的各种排序函数,这时getmethod方法和invoke方法的参数不知道如何解决了。我写的这个实现一直报参数异常
代码
class SortClass<T extends Comparable>{
//选择排序
public void selectSort(T[] a){
for(int i = 0; i < a.length; i++){
int min = i;
for(int j = i+1; j < a.length; j++){
if(a[j].compareTo(a[min]) < 1){
swap(a,j,min);
}
}
}
}
//交换函数
public void swap(T[] arr, int a, int b){
T temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
//测试用时函数
public void testSort(String sortName,Object[] a){
long startTime = System.currentTimeMillis();
try {
Method method = this.getClass().getMethod(sortName,Object[].class);
method.invoke(this,a);
} catch (NoSuchMethodException e) {
System.out.println(e.getMessage()+" not find");
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println(sortName + "use time:" + (endTime-startTime));
}
}
希望能有一些改进的方法或者代码来完成这个实现。
在invoke方法那,把a强转为object
要不然数组会被解析成一个个参数,而不是一整个数组作为参数