Let: B extends A
;
谁能告诉我为什么这段代码:
List<Class<? extends A>> l = Arrays.asList(B.class);
在尝试编译时抛出以下错误:
error: incompatible types: List<Class<B>> cannot be converted to List<Class<? extends A>>
ArrayList<Class<? extends A>> l = new ArrayList<Class<? extends A>>();
l.add(B.class);
工作得很好?
根据文档,Arrays.asList(..)
方法将相同类型的参数变量作为其参数变量,并返回该类型的列表。
public static <T> List<T> asList(T... a)
如果Class<B>
绑定到类型T
,则方法返回类型为List<Class<B>>
,即而不是类型List<Class<? extends A>>
。这样就会出现编译错误。
可以通过添加显式强制转换来修复,如下所示:
List<Class<? extends A>> l = Arrays.<Class<? extends A>>asList(B.class);
正如Sotirios 所提到的,Java 8通过引入这里解释的多表达式解决了这个繁琐的问题。