Недавно я столкнулся с странным синтаксисом для явного объявления родовых типов при вызове методов Java. Например:
Collections.<String>emptyList();
возвращает пустой List<String>
. Однако это кажется глупым, так как реализация <T> emptyList()
- это просто непроверенный тип cast (List<T>) EMPTY_LIST
, так что все результаты имеют однотипное стирание (и являются одним и тем же объектом). Более того, этот вид объявления явного типа обычно не является потому что компилятор часто выводит типы:
List<String> empty = Collections.emptyList();
После того, как я сделал еще несколько копаний, я нашел два других раза, когда вы захотите использовать этот синтаксис, и все они связаны с использованием библиотеки Guava и , по-видимому, попыткой поставить слишком много операторов в одной строке.
-
Украшение коллекции, например, с помощью синхронизированной обертки, а компилятор не может вывести типы. Следующее не работает, если вы выведете объявление типа:
cannot convert from Set<Object> to Set<String>
:Set<String> set = Collections.synchronizedSet(Sets.<String>newHashSet());
-
Получение менее специфических параметров типа, когда компилятор пытается сделать те, которые слишком специфичны. Например, без объявления типа также возникает следующее выражение:
cannot convert from Map<String, String> to Map<String, Object>
:Map<String, Object> toJson = ImmutableMap.<String, Object>of("foo", "bar");
Мне кажется, что в первом случае параметры выводимого типа слишком общие, а во втором случае они слишком специфичны, но я полагаю, что это всего лишь артефакт системы дженериков в Java.
Однако эту конструкцию языка можно избежать, за исключением тех странных случаев использования, изобретенных командой Guava. Более того, мне кажется, что есть способ для компилятора вывести аргументы типа в обоих примерах, и разработчики просто решили не делать этого. Существуют ли примеры того, что он когда-либо был необходим или полезен для использования этой конструкции в программировании на Java или существует ли она исключительно для упрощения процесса разработки компилятора/JDK?