Используется для странного вида синтаксиса объявления явного аргумента типа в Java

Недавно я натолкнулся на странный синтаксис для явного объявления универсальных типов при вызове методов Java. Например:

Collections.<String>emptyList();

возвращает пустоеList<String>, Тем не менее, это выглядит глупо, так как реализация<T> emptyList() это просто непроверенный тип актерского состава(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?

Ответы на вопрос(3)

Ваш ответ на вопрос