#java #generics
Приветствую всех! Читаю у Брюса Эккеля про дженерики, попался в качестве примера такой код: package net.mindview.util; import java.util.*; public class New { public staticMap 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.
Ответы
Ответ 1
Вся проблема в том, что у вас Java 8. Укажите среде разработки, что нужно собрать это для Java 6, и вы увидите, что проект действительно не компилируется. Все дело в даймонд операторах, которых в Java 6 еще не было, соответсвенно, создавая f(New.map()) считается, что это map с двумя objecт, а ожидается параметризованный другими типами Map. Чтобы понять проблему, давайте возьмем пример попроще. List= new ArrayList <>(); Здесь после листа дженерик со стрингом, почему-то не отображается правильно... Это вполне допустимо для Java 8, поскольку Java 8 видит в левой части параметризованный стрингами лист и сама дописывает в дженерик левой части тот же стринг в качестве параметра. Однако, если запустить это на Java 6, то будет ошибка компиляции, потребуются явные параметры дженериков `List = new ArrayList ();` То-же самое происходит в Вашем примере
Комментариев нет:
Отправить комментарий