Страницы

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

пятница, 24 января 2020 г.

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

#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 ();` То-же самое происходит в Вашем примере

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

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