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