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;
}