Używa dziwnie wyglądającej składni deklaracji typu jawnej w Javie

Niedawno natknąłem się na dziwną składnię jawnego deklarowania typów ogólnych podczas wywoływania metod Java. Na przykład:

Collections.<String>emptyList();

zwraca pustąList<String>. Jednak wydaje się to głupie, ponieważ realizacja<T> emptyList() jest po prostu niezaznaczonym typem obsady(List<T>) EMPTY_LIST, tak że wszystkie wyniki mają ten sam typ wymazania (i są tym samym obiektem). Ponadto tego rodzaju jawna deklaracja typu zwykle nie jest potrzebna, ponieważ kompilator często może wywnioskować typy:

List<String> empty = Collections.emptyList();

Po zrobieniu czegoś więcej znalazłem dwa inne czasy, w których chciałbyś użyć tej składni, a wszystkie one są spowodowane używaniem biblioteki Guava inajwyraźniej próbuje umieścić zbyt wiele wypowiedzi w jednym wierszu.

Dekorowanie kolekcji, na przykład za pomocą zsynchronizowanego opakowania, a kompilator nie jest w stanie wywnioskować typów. Poniższe informacje nie działają, jeśli wyciągniesz deklarację typu:cannot convert from Set<Object> to Set<String>:

Set<String> set = Collections.synchronizedSet(Sets.<String>newHashSet());

Uzyskiwanie mniej specyficznych parametrów typu, gdy kompilator próbuje utworzyć takie, które są zbyt szczegółowe. Na przykład bez deklaracji typu narzeka się również następująca instrukcja:cannot convert from Map<String, String> to Map<String, Object>:

Map<String, Object> toJson = ImmutableMap.<String, Object>of("foo", "bar");

Uważam za ironiczne, że w pierwszym przypadku wnioskowane parametry typu są zbyt ogólne, aw drugim są zbyt szczegółowe, ale przypuszczam, że jest to tylko artefakt systemu ogólnego w Javie.

Jednak ta konstrukcja języka wydaje się być możliwa do uniknięcia, z wyjątkiem tychdziwne przypadki użycia wymyślone przez zespół Guava. Co więcej, wydaje mi się to oczywistetamjest sposób dla kompilatora na wnioskowanie argumentów typu w obu powyższych przykładach, a programiści postanowili tego nie robić. Czy istnieją przykłady, czy kiedykolwiek jest konieczne lub użyteczne użycie tego konstruktu w programowaniu Java, czy też istnieje tylko po to, aby kompilator był prostszy / łatwiejszy w rozwoju JDK?

questionAnswers(3)

yourAnswerToTheQuestion