62,614
社区成员
发帖
与我相关
我的任务
分享
Bound mismatch: The generic method f(Collection<? extends T>) of type CollectionsTest is not applicable for the arguments (List<A>). The inferred type A is not a valid substitute for the bounded parameter <T extends Object & Comparable<? super T>>
因为? extends T要求T以是coll参数类型的父类为条件进行推断,<T extends Object & Comparable<? super T>>又要求T必须实现Comparable接口,故产生上述现象。同理,若令B实现Comparable<C>,则用b调用max也会编译错误。
至于参数类型T本身,倒不是必须要对应某个实际类型,它只是为了表达推断关系的一个代位符。
Eclipse等IDE,鼠标悬停在泛型方法调用上时,能看到类型推断的结果。
最次,在调用泛型方法时,是可以手动指定参数类型的,比如以下代码:
Arrays.asList(1.1, 1);
List<Number> a = Arrays.asList(1.1, 1);
List<Number> b = Arrays.<Number>asList(1.1, 1);
第一行编译警告:
Type safety: A generic array of Number&Comparable<?> is created for a varargs parameter
意思就是存在两个可能的推断类型Number和Comparable<?>。
所以第二行编译错误:
Type mismatch: cannot convert from List<Number&Comparable<?>> to List<Number>
而第三行可以通过编译,这也是调用泛型方法指定参数类型的语法。