2016-08-04 2 views
6

У меня есть следующий код, который отлично работает на Java 8:разница подстановочных Java в 7 и 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 может использовать окружающий контекст. Таким образом, тип выражения Collections.singletonList(String.class) в Java-7 является наиболее точным типом, который можно определить из этого выражения, а именно 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); 
Смежные вопросы