Java 符合等式约束

Java 符合等式约束,java,generics,Java,Generics,我写了一些通用方法。它适用于第一级子体。但对于第二级后代的对象,它失败了 package com.company; import java.util.ArrayList; import java.util.List; public class Main { public static <T extends Comparable<T>> int f(List<T> list, T item) { return 0; }

我写了一些通用方法。它适用于第一级子体。但对于第二级后代的对象,它失败了

package com.company;

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static <T extends Comparable<T>> int f(List<T> list, T item) {
        return 0;
    }

    static class A implements Comparable<A> {
        @Override
        public int compareTo(A o) {
            return 0;
        }
    }

    static class B extends  A {
    }

    public static void main(String[] args) {
        List<A> as = new ArrayList<A>();
        List<B> bs = new ArrayList<B>();
        A a = new A();
        B b = new B();

        f(as, a); // works
        f(bs, b); // <-------- error
    }
}
package.com公司;
导入java.util.ArrayList;
导入java.util.List;
公共班机{
公共静态int f(列表,T项){
返回0;
}
静态类A实现了可比较的{
@凌驾
公共整数比较(AO){
返回0;
}
}
静态类B扩展了{
}
公共静态void main(字符串[]args){
列表为=新的ArrayList();
列表bs=新的ArrayList();
A=新的A();
B=新的B();
f(as,a);//有效

f(bs,b);//函数
f
的类型参数
T
必须根据定义实现
可比
B
不实现
可比
,而是实现
可比
。如果希望能够使用
B
调用函数,则类应实现
可比较的
,例如

static class B extends A implements Comparable<B> {
    @Override
    public int compareTo(B o) {
        return super.compareTo(o);
    }
}

函数
f
的类型参数
T
必须根据定义实现
Comparable
B
不实现
Comparable
,而是实现
Comparable
。当您希望能够使用
B
调用函数时,类应该实现
Comparable
,例如,像这样

static class B extends A implements Comparable<B> {
    @Override
    public int compareTo(B o) {
        return super.compareTo(o);
    }
}
public static <T extends Comparable<? super T>> int f(List<T> list, T item) {
    return 0;
}