Java 7和8中通配符的区别

6

我有以下代码,在Java 8上运行良好:

List<Class<?>> KEY_NAME_CLASSES = Collections.singletonList(String.class);

但是当我尝试使用Java 7编译器时,会出现错误:

incompatible types: java.util.List<java.lang.Class<java.lang.String>> cannot be converted to java.util.List<java.lang.Class<?>>

为什么?在Java 7中有没有使用这种通配符的方法?
1个回答

10

Java-7和Java-8在类型推断方面存在显著差异。简而言之,为了确定表达式的类型,Java-7仅使用表达式本身,而Java-8可以使用周围上下文。因此,在Java-7中,表达式Collections.singletonList(String.class)的类型是可以从该表达式中确定的最精确类型,即List<Class<String>>。而Java-8更加智能:它还查看这个表达式被分配给了另一个兼容的类型List<Class<?>>,因此它同样将Collections.singletonList(String.class)的类型设置为List<Class<?>>

要使此代码在Java-7中工作,您应该明确指定泛型类型:

List<Class<?>> KEY_NAME_CLASSES = Collections.<Class<?>>singletonList(String.class);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接