我有以下代码,它在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中使用这些通配符?
答案 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);