The*_*ail 1 java generics compiler-errors
我正在尝试编写一个自定义比较器方法来比较自定义类 Customer 中的不同内容,并且在编译时得到incompatible types: T cannot be converted to Customer. DataChecker.compare() 是从泛型方法运行的,但我知道无论何时运行 T 都会是在重载的 DataChecker.compare() 方法中定义的类型。下面是我的代码:
public int compare(Customer cust1, Customer cust2, String sortBy){ //Comparator interface for customers
if (sortBy == "ID"){
if (cust1.getID() < cust2.getID()){
return -1;
} else if (cust1.getID() == cust2.getID()){
return 0;
} else {
return 1;
}
}
throw new IllegalArgumentException("Not a valid compare for Customer: " + sortBy);
}
Run Code Online (Sandbox Code Playgroud)
此处调用该方法(左侧和右侧是 T[ ],但运行时 T 将是 DataChecker.compare() 中定义的类型之一 - 例如 Customer -):
if (DataChecker.compare(left[i], right[j], sortBy) <= 0){
input[k++] = left[i++];
} else {
input[k++] = right[j++];
}
Run Code Online (Sandbox Code Playgroud)
提前致谢
T 将是在重载的 DataChecker.compare() 方法中定义的类型。
那几乎完全没用。在java中,重载是完全不同的方法,完全没有任何关系;代码在编译(写入)时解释为重载之一,然后将该特定方法硬编码到您的类文件中。在运行时,override是动态应用的(java 是完全动态调度的),但是每个方法的“全名”包括它的完整类型、名称、每个参数的类型以及返回类型。
换句话说,不可能告诉编译器:只要弄清楚;调用正确的compare方法,我保证它会在那里。我想,如果没有,抛出 ClassCastException 什么的。
如果你考虑一段时间,这开始变得有意义。String是的一个亚型Object,也是CharSequence,也是Serializable。想象一下,你有compare(Serializable a, Serializable b)和compare(CharSequence a, CharSequence b)。应该叫哪一个?
那么,唯一的解决方案是要么没有重载,要么创建一个作为此动态进程的入口点的方法,它会根据例如一个Map<Class<?>, BiPredicate<?>>或一堆instanceof检查进行自己的手动动态分派。
| 归档时间: |
|
| 查看次数: |
65 次 |
| 最近记录: |