Странный универсальный Java

Что это означает?

HashBiMap<Character, Integer> charOcc = HashBiMap.<Character, Integer> create();
6
задан Michael Myers 12 January 2010 в 16:00
поделиться

5 ответов

Создание () - это универсальный метод. Поскольку это статично и не имеет никаких параметров (отсюда нет вывода типа), единственным способом, которым вы можете сказать, что общие параметры состоят в этом странном . <Характер, целое число> Синтаксис.

Редактировать: Это на самом деле не нужно в этом конкретном случае; Компилятор может выводить общие типы из левой стороны. Но иногда это необходимо в других случаях, таких как этот вопрос: универсальный метод в Java без общих аргументов

8
ответ дан 8 December 2019 в 04:52
поделиться

Это означает, что метод статическое создание () метод () имеет параметры типа, такие как:

public static <Character, Integer> HashBiMap<Character, Integer> create() {..}
4
ответ дан 8 December 2019 в 04:52
поделиться

HASHBIMAP, вероятно, имеет метод

public static <K,V> HashBiMap<K,V> create(){...}

с использованием синтаксиса

HashBiMap<Character, Integer> charOcc = HashBiMap.<Character, Integer> create();

, вы проходите символ для k и целого числа для V.

1
ответ дан 8 December 2019 в 04:52
поделиться

Предположительно, это правая сторона (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);
3
ответ дан 8 December 2019 в 04:52
поделиться

Это вызов общий статический метод ( создать () ) с помощью Персонаж и целое число как аргументы типа. Например, если вы смотрите на коллекции Google Java, декларация имеет эту подпись:

public static <K,V> HashBiMap<K,V> create()

Часть , указывает, что это параметры типа для метода.

Эквивалентный вызов в C # был бы одним из:

HashBiMap.Create<Character, Integer>();
HashBiMap<Character, Integer>.Create();

в зависимости от того, хотелось ли вы его быть универсальным методом в ненгенерическом типе или ненгентический метод в общем типе.

Позиционирование параметров типа и аргументов типа в Java неразрушается.

8
ответ дан 8 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: