2016-08-04 29 views
6

我有下面的代码,它基于Java 8正常工作:的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中使用这种通配符?

回答

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);