Java Generics - 插入内部类型参数

时间:2013-11-25 22:27:06

标签: java generics

我是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>>
    }
}

4 个答案:

答案 0 :(得分:3)

E extends Comparable<E>表示:类型E能够与相同类型E的其他对象进行比较。

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

public class Compare<T> implements Comparable<T>

使用此比较类型很难理解您想要实现的目标。

答案 1 :(得分:2)

你的方法

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

期望类型EComparable<E>的子类型。但是,您传递的是Compare<String>,它不是<Comparable<Compare<String>>的子类型,而是Comparable<String>的子类型。

如果您需要更多帮助,您必须澄清您要做的事情。

答案 2 :(得分:1)

我的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){

答案 3 :(得分:1)

要将类定义为可比较,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);
}