Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java不兼容类型:T无法转换为我的类_Java_Generics_Compiler Errors - Fatal编程技术网

Java不兼容类型:T无法转换为我的类

Java不兼容类型:T无法转换为我的类,java,generics,compiler-errors,Java,Generics,Compiler Errors,我试图编写一个自定义比较器方法来比较自定义类Customer中的不同内容,当我编译时,我得到了不兼容的类型:T无法转换为Customer。DataChecker.compare()是从泛型方法运行的,但我知道无论何时运行它,T都将是重载DataChecker.compare()方法中定义的类型。下面是我的代码: public int compare(Customer cust1, Customer cust2, String sortBy){ //Comparator interface for

我试图编写一个自定义比较器方法来比较自定义类Customer中的不同内容,当我编译时,我得到了
不兼容的类型:T无法转换为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);
}
public int compare(Customer cust1,Customer cust2,String sortBy){//Comparator客户接口
如果(排序方式==“ID”){
if(cust1.getID()
此处调用该方法(左侧和右侧为T[],但运行此方法时,T将是DataChecker.compare()中定义的类型之一,例如Customer):

if(DataChecker.compare(左[i],右[j],排序)
T将是在重载的DataChecker.compare()方法中定义的类型

这几乎毫无用处。在java中,重载是完全不同的方法,它们之间完全没有任何关系;代码在编译(写)时被解释为一个重载,然后该特定方法被硬编码到类文件中。在运行时,重写被动态应用(java是完全动态调度的),但是每个方法的“全名”包括它的完整类型、名称、每个参数的类型以及返回类型

换句话说,不可能告诉编译器:只需找出它;调用正确的
compare
方法,我向您保证它会在那里。我猜,如果没有,抛出ClassCastException或其他东西

如果你想一想,这就有了一些意义。
String
对象的子类型,也是
CharSequence
的子类型,也是
Serializable
的子类型。想象一下你有
比较(Serializable a,Serializable b)
以及
比较(CharSequence a,CharSequence b)
。应该调用哪一个

因此,唯一的解决方案是要么没有重载,要么创建一个方法作为这个动态过程的入口点,它根据
Map>
或一系列
实例的
检查来执行自己的手动动态调度

T将是在重载的DataChecker.compare()方法中定义的类型

这几乎毫无用处。在java中,重载是完全不同的方法,它们之间完全没有任何关系;代码在编译(写)时被解释为一个重载,然后该特定方法被硬编码到类文件中。在运行时,重写被动态应用(java是完全动态调度的),但是每个方法的“全名”包括它的完整类型、名称、每个参数的类型以及返回类型

换句话说,不可能告诉编译器:只需找出它;调用正确的
compare
方法,我向您保证它会在那里。我猜,如果没有,抛出ClassCastException或其他东西

如果你想一想,这就有了一些意义。
String
对象的子类型,也是
CharSequence
的子类型,也是
Serializable
的子类型。想象一下你有
比较(Serializable a,Serializable b)
以及
比较(CharSequence a,CharSequence b)
。应该调用哪一个


因此,唯一的解决方案是要么没有重载,要么创建一个方法作为这个动态过程的入口点,它根据
Map>
或一堆
实例进行
检查来执行自己的手动动态调度。

类型泛型在运行时被删除,因此
T
只是成为
对象t
。你知道
都是
Customer
的实例,但编译器不知道。你必须使用显式转换来告诉它。只要使用
(Customer)left[i]
(Customer)right[j]
就可以了。是的,这可以工作,但并不总是
(客户)左[i]
由于将有其他类型使用相同的方法,请尝试在类型定义中使用类型
instead@Bohemian我已经试过了,但我认为我做得不对。我在互联网上找不到任何能正确解释比较器和泛型的东西。你能更详细地解释你的意思吗?你必须检查一下那么
instanceof
是什么类型。编译器不知道要调用哪个方法重载,必须通过显式转换告诉它。想象一下,如果有两个重载:一个接受
客户
s,另一个接受
对象
s。可以将
客户
的实例传递给e在本例中是另一个方法重载。编译器选择哪一个?它根据您指定的类型进行选择。因此,您需要显式声明该参数是哪种类型。类型泛型在运行时被删除,因此
T
只是变成
Object
。您知道
left
right
都是<代码>客户
,但编译器不知道。您必须使用显式转换来告诉它。只需使用
(客户)左[i]
(客户)右[j]
,您就可以完成所有设置。是的,这可以工作,但并不总是
(客户)左[i]
由于将有其他类型使用相同的方法,请尝试在类型定义中使用类型
instead@Bohemian我试过了
if (DataChecker.compare(left[i], right[j], sortBy) <= 0){
        input[k++] = left[i++];
} else {
        input[k++] = right[j++];
}