Что это означает?
HashBiMap<Character, Integer> charOcc = HashBiMap.<Character, Integer> create();
Создание ()
- это универсальный метод. Поскольку это статично и не имеет никаких параметров (отсюда нет вывода типа), единственным способом, которым вы можете сказать, что общие параметры состоят в этом странном . <Характер, целое число>
Синтаксис.
Редактировать: Это на самом деле не нужно в этом конкретном случае; Компилятор может выводить общие типы из левой стороны. Но иногда это необходимо в других случаях, таких как этот вопрос: универсальный метод в Java без общих аргументов
Это означает, что метод статическое создание ()
метод () имеет параметры типа, такие как:
public static <Character, Integer> HashBiMap<Character, Integer> create() {..}
HASHBIMAP, вероятно, имеет метод
public static <K,V> HashBiMap<K,V> create(){...}
с использованием синтаксиса
HashBiMap<Character, Integer> charOcc = HashBiMap.<Character, Integer> create();
, вы проходите символ для k и целого числа для V.
Предположительно, это правая сторона (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);
Это вызов общий статический метод ( создать ()
) с помощью Персонаж
и целое число
как аргументы типа. Например, если вы смотрите на коллекции Google Java, декларация имеет эту подпись:
public static <K,V> HashBiMap<K,V> create()
Часть
, указывает, что это параметры типа для метода.
Эквивалентный вызов в C # был бы одним из:
HashBiMap.Create<Character, Integer>();
HashBiMap<Character, Integer>.Create();
в зависимости от того, хотелось ли вы его быть универсальным методом в ненгенерическом типе или ненгентический метод в общем типе.
Позиционирование параметров типа и аргументов типа в Java неразрушается.