#java #generics
Приветствую всех! Читаю у Брюса Эккеля про дженерики, попался в качестве примера
такой код:
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.
Ответы
Ответ 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 ();` То-же самое происходит в Вашем примере
Комментариев нет:
Отправить комментарий