Что это значит?
HashBiMap<Character, Integer> charOcc = HashBiMap.<Character, Integer> create();
Что это значит?
HashBiMap<Character, Integer> charOcc = HashBiMap.<Character, Integer> create();
create()
— это общий метод. Поскольку он статичен и не имеет параметров (следовательно, нет вывода о типе), единственный способ, которым вы можете сказать ему, что такое общие параметры, — это странный синтаксис .<Character, Integer>
.
Редактировать: в данном конкретном случае в этом нет необходимости; компилятор может вывести общие типы с левой стороны. Но иногда это необходимо в других случаях, таких как этот вопрос: Универсальный метод в Java без общего аргумента
Он вызывает универсальный статический метод (create()
), используя Character
и Integer
в качестве аргументов типа. Например, если вы просматриваете коллекции Google Java, объявление имеет следующую подпись:
public static <K,V> HashBiMap<K,V> create()
Часть <K,V>
сама по себе указывает, что это параметры типа для метода.
Эквивалентный вызов в C# будет одним из:
HashBiMap.Create<Character, Integer>();
HashBiMap<Character, Integer>.Create();
в зависимости от того, хотите ли вы, чтобы это был универсальный метод в неуниверсальном типе или неуниверсальный метод в универсальном типе.
Позиционирование параметров типа и аргументов типа в Java неинтуитивно, IMO.
Это означает, что метод static create()
имеет параметры типа, например:
public static <Character, Integer> HashBiMap<Character, Integer> create() {..}
Предположительно, это правая сторона (RHS), которую вы считаете странной.
HashBiMap.<Character, Integer> create();
Обычно необходимо использовать только параметры типа в LHS при вызове универсального статического метода. Но иногда статический метод не выводит параметры типа так, как вы предполагали. В этих случаях вы также можете использовать параметры типа в RHS, чтобы привести параметры типа к тому, что вы намеревались. Это известно как параметр явного типа.
Вот пример того, когда параметры типа не выводятся правильно (адаптировано из отличной книги "Effective Java"):
Учитывая статический метод
public static <E> Set<E> union(Set<? extends E> s1, Set<? extends E> s2)
вы можете подумать, что можете сделать это:
Set<Integer> integers = ... ;
Set<Double> doubles = ... ;
Set<Number> numbers = union(integers, doubles);
Если вы попробуете это, вы получите это сообщение об ошибке:
Union.java:14: incompatible types
found : Set<Number & Comparable<? extends Number & Comparable<?>>>
required: Set<Number>
Set<Number> numbers = union(integers, doubles);
Если компилятор не выводит тип, который вы хотели бы иметь, вы можете указать ему, какой тип использовать с явным параметром типа. С добавлением этого явного параметра типа программа компилируется чисто:
Set<Number> numbers = Union.<Number>union(integers, doubles);
HashBiMap, вероятно, имеет метод
public static <K,V> HashBiMap<K,V> create(){...}
Использование синтаксиса
HashBiMap<Character, Integer> charOcc = HashBiMap.<Character, Integer> create();
вы передаете символ для K и целое число для V.
Если вы хотите избежать громоздкого синтаксиса предоставления формальных параметров, вы можете использовать приведение для ввода подсказки.
Используя ваш пример,
Set<Integer> integers = ... ;
Set<Double> doubles = ... ;
Set<Number> numbers = union((Set<Number>)integers, doubles);
Это будет принято компилятором и позволит избежать использования
Set<Number> numbers = Union.<Number>union(integers, doubles);
Map<Character, Integer> myMap = Maps.newHashMap();
- person Michael Myers   schedule 12.01.2010