不清楚您是要在编译时还是在运行时执行检查。如果您只是想确保传递给方法的列表参数包含某些类型的对象,那么请T
适当地重新定义。
例如,要确保编译器只允许将 aList<Comparable>
传递给此方法,请重新定义T
为:
public <T extends Comparable<? super T>> List<T> doSth(List<T> l) {
// Method body omitted
}
然后,您可以使用方法重载(而不是 if-else 语句)来确保为T
. 换句话说,替换这个:
public <T> List<T> doSth(List<T> l) {
if(T extends Comparable) {
// do one thing
} else {
// do another
}
return null
}
用这些:
public <T extends Comparable<? super T>> List<T> doSth(List<T> l) {
// do one thing
return null;
}
public <T> List<T> doSth(List<T> l, Class<T> clazz) {
// do another
return null;
}
但是,您需要记住选择要调用的重载方法,并且泛型类型检查仅在编译时进行!例如,下面的代码:
List<? extends Serializable> alist = new ArrayList<Integer>();
doSth(alist);
实际上会调用第二种doSth
方法,因为编译时类型参数 ( ? extends Serializable
) 没有实现Comparable
,即使运行时类型参数 ( Integer
) 实现了。