Страницы

Поиск по вопросам

понедельник, 18 марта 2019 г.

Пример по generics из Философии Java

Приветствую всех! Читаю у Брюса Эккеля про дженерики, попался в качестве примера такой код:
package net.mindview.util; import java.util.*; public class New {
public static Map map() { return new HashMap(); } }
public class LimitsOfInference { static void f(Map> petPeople) {}
public static void main(String[] args) { // f(New.map()); // Does not compile } }
И объяснение:
Type inference doesn’t work for anything other than assignment. If you pass the result of a method call such as New.map( ) as an argument to another method, the compiler will not try to perform type inference. Instead it will treat the method call as though the return value is assigned to a variable of type Object.
И тем не менее я воспроизвел этот код в IDE, он успешно скомпилировался и запустился. Это ошибка или информация в книге устарела? У меня jdk 8.


Ответ

Вся проблема в том, что у вас Java 8.
Укажите среде разработки, что нужно собрать это для Java 6, и вы увидите, что проект действительно не компилируется.
Все дело в даймонд операторах, которых в Java 6 еще не было, соответсвенно, создавая f(New.map()) считается, что это map с двумя objecт, а ожидается параметризованный другими типами Map.
Чтобы понять проблему, давайте возьмем пример попроще.
List = new ArrayList <>();
Здесь после листа дженерик со стрингом, почему-то не отображается правильно... Это вполне допустимо для Java 8, поскольку Java 8 видит в левой части параметризованный стрингами лист и сама дописывает в дженерик левой части тот же стринг в качестве параметра.
Однако, если запустить это на Java 6, то будет ошибка компиляции, потребуются явные параметры дженериков
`List = new ArrayList ();`
То-же самое происходит в Вашем примере

Комментариев нет:

Отправить комментарий