Java泛型-插入内部类型参数



我是java新手。我只是试图将Comparable<String>传递到泛型类型<E extends Comparable<E>>的方法参数中。我相信<E extends Comparable<E>>的意义是任何扩展Comparable的对象。请让我知道如何传递Comparable<String>或任何扩展Comparable<String>并包含其他对象的对象。

编译器给我错误The inferred type Compare<String> is not a valid substitute for the bounded parameter <E extends Comparable<E>>

代码:

public class Compare<T> implements Comparable<T>{
    public int compareTo(T o) {
        return 0; // Not worried about logic
    }
}
class CompareTest{
    public <E extends Comparable<E>>void testGeneric(E e){
        System.out.println("Executed");
    }
    public static void main(String args[]){
        Compare<String> compare = new Compare<String>();
        CompareTest test = new CompareTest();
        test.testGeneric(compare);
        //The inferred type Compare<String> is not a valid substitute for the bounded
        //parameter <E extends Comparable<E>>
    }
}

E extends Comparable<E>的意思是:一个能够与其他相同类型的对象进行比较的类型E。

但是您的比较类型不符合条件。它无法与另一个比较。Compare<T>只能将自己与T进行比较,而不能与Compare<T>进行比较,因为它被声明为

public class Compare<T> implements Comparable<T>

很难理解这种比较类型想要实现什么。

您的方法

public <E extends Comparable<E>> void testGeneric(E e){

期望作为CCD_ 13的子类型的类型CCD_。但您正在传递一个Compare<String>,它不是<Comparable<Compare<String>>的子类型,而是Comparable<String>的子类型。

如果你需要更多的帮助,你必须澄清你想做什么。

IDE中的错误显示:

Inferred type 'Compare<java.lang.String>' for type parameter 'E' is not within its bound; 
should implement 'java.lang.Comparable<Compare<java.lang.String>>'

似乎E被推断为Compare<String>而不是String。要使E成为String,请尝试以下操作:

public <E extends Comparable<E>> void testGeneric(Comparable<E> e){

要将类定义为可比较的,Comparable的泛型参数必须是类本身:

public class MyComparable implements Comparable<MyComparable> {
    public int compareTo(MyComparable o) {
        return 0;
    }
}

将其应用于您的类,您将获得以下代码(编译):

public static class Compare<T> implements Comparable<Compare<T>> {
    public int compareTo(Compare<T> o) {
        return 0; // Not worried about logic
    }
}
class CompareTest {
    public <E extends Comparable<E>> void testGeneric(E e) {
        System.out.println("Executed");
    }
}
public static void main(String[] args) {
    Compare<String> compare = new Compare<String>();
    CompareTest test = new CompareTest();
    test.testGeneric(compare);
}

最新更新