Почему JDK Map.get не поддерживает определение типа возвращаемого значения - PullRequest
1 голос
/ 05 сентября 2011

В качестве дополнительного вопроса к По каким причинам Map.get (ключ объекта) не является (полностью) универсальным , почему интерфейс JDK 6 и 7 Map не определяет "get "метод как универсальный метод, так что компилятор может использовать вывод типа для возвращаемого значения?

Например, если« get »были определены как:

public <T extends V> T get(Object key)

, тогда вызывающая сторона можетwrite:

Map<String,Object> m = new HashMap<>();
m.put("key", new Foo());
...
Foo f = m.get("key");   // type inference, implicit cast

В приведенном выше фрагменте я мог бы определить m как Map<String,Foo>, но учтите, что определение m как Map<String,Object> вместо Map<String,Foo> полезно во многих ситуациях, например, когда mможет содержать значения любого типа, но тип значения все еще может быть выведен на основе ключа, например, простой кэш или объект контекста.

Ответы [ 2 ]

2 голосов
/ 05 сентября 2011

Потому что это (в общем) небезопасно делать это. Map<String, Object> определенно заявляет, что его значениями могут быть любые типы Object, а не просто Foo, поэтому при обычном использовании не следует присваивать его значения чему-либо еще. Это обычно будет ошибкой программиста, которую система типов должна (и делает) помочь вам избежать. Если вы хотите сделать что-то подобное, всегда есть приведение, которое делает ваше намерение явным.

0 голосов
/ 05 сентября 2011

В этом конкретном случае компилятор пытается предупредить вас о небезопасных операциях, а косвенное приведение к тому, что вам нужно, считается небезопасным. Вам необходимо явное приведение, чтобы показать, что разработчик «знает», какого типа ожидать.

Java не поддерживает вывод типов ни для одного возвращаемого типа. Он определяет тип возвращаемого значения метода или выражения, и присваивание может выполнять неявное приведение.

Единственное исключение, которое я видел, - это добавление MethodHandle.invokeExact () в Java 7 и специальная обработка JVM. Это новая функция, которая работает не во всех случаях. ;)

...