Java 不兼容的类型:T 无法转换为 My Class
Java incompatible type: T cannot be converted to My Class
我正在尝试编写自定义比较器方法来比较自定义 class 客户中的不同内容,当我编译时我得到 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);
}
方法在这里被调用(左边和右边是 T[ ] 但当这是 运行 T 将是类型之一 - 例如 Customer - 在 DataChecker.compare() 中定义) :
if (DataChecker.compare(left[i], right[j], sortBy) <= 0){
input[k++] = left[i++];
} else {
input[k++] = right[j++];
}
提前致谢
T will be a type that is defined in the overloaded DataChecker.compare() method.
那几乎完全没用。在 java 中,重载是 完全不同的方法 ,它们完全没有任何关系;代码在编译(写入)时解释为其中一个重载,然后将该特定方法硬编码到您的 class 文件中。在运行时,override 是动态应用的(java 是完全动态调度的),但是每个方法的 'full name' 包括它的完整类型、名称和每个参数的类型,以及 return 类型。
换句话说,不可能告诉编译器:Just figure it out;调用正确的 compare
方法,我保证它会在那里。我想,如果没有,抛出 ClassCastException 或其他东西。
如果你想一想,这开始有点道理了。 String
是 Object
的子类型,也是 CharSequence
的子类型,也是 Serializable
的子类型。假设您有 compare(Serializable a, Serializable b)
以及 compare(CharSequence a, CharSequence b)
。应该叫哪个?
那么,唯一的解决方案是要么没有重载,要么创建一个方法作为这个动态过程的入口点,它根据例如Map<Class<?>, BiPredicate<?>>
或一堆 instanceof
支票。
我正在尝试编写自定义比较器方法来比较自定义 class 客户中的不同内容,当我编译时我得到 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);
}
方法在这里被调用(左边和右边是 T[ ] 但当这是 运行 T 将是类型之一 - 例如 Customer - 在 DataChecker.compare() 中定义) :
if (DataChecker.compare(left[i], right[j], sortBy) <= 0){
input[k++] = left[i++];
} else {
input[k++] = right[j++];
}
提前致谢
T will be a type that is defined in the overloaded DataChecker.compare() method.
那几乎完全没用。在 java 中,重载是 完全不同的方法 ,它们完全没有任何关系;代码在编译(写入)时解释为其中一个重载,然后将该特定方法硬编码到您的 class 文件中。在运行时,override 是动态应用的(java 是完全动态调度的),但是每个方法的 'full name' 包括它的完整类型、名称和每个参数的类型,以及 return 类型。
换句话说,不可能告诉编译器:Just figure it out;调用正确的 compare
方法,我保证它会在那里。我想,如果没有,抛出 ClassCastException 或其他东西。
如果你想一想,这开始有点道理了。 String
是 Object
的子类型,也是 CharSequence
的子类型,也是 Serializable
的子类型。假设您有 compare(Serializable a, Serializable b)
以及 compare(CharSequence a, CharSequence b)
。应该叫哪个?
那么,唯一的解决方案是要么没有重载,要么创建一个方法作为这个动态过程的入口点,它根据例如Map<Class<?>, BiPredicate<?>>
或一堆 instanceof
支票。