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