Java通配符在7和8之间存在差异

时间:2016-08-04 10:07:15

标签: java generics

我有以下代码,它在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 个答案:

答案 0 :(得分: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);