Spec-Zone .ru
спецификации, руководства, описания, API
|
Можно заменить параметры типа, требуемые вызвать конструктора универсального класса с пустым множеством параметров типа (<>
) пока компилятор может вывести параметры типа от контекста. Эту пару угловых скобок неофициально вызывают ромбом.
Например, рассмотрите следующее объявление переменной:
Map<String, List<String>> myMap = new HashMap<String, List<String>>();
В Java SE 7, можно заменить параметризованным типом конструктора с пустым множеством параметров типа (<>
):
Map<String, List<String>> myMap = new HashMap<>();
Отметьте, что, чтобы использовать в своих интересах автоматический вывод типа во время универсального инстанцирования класса, следует определить ромб. В следующем примере компилятор генерирует преобразование непроверенное, предупреждающее потому что HashMap()
конструктор обращается к HashMap
необработанный тип, не Map<String, List<String>>
введите:
Map<String, List<String>> myMap = new HashMap(); // unchecked conversion warning
Java SE 7 поддерживает ограниченный вывод типа для универсального создания экземпляра; можно только использовать вывод типа, если параметризованный тип конструктора очевиден из контекста. Например, следующий пример не компилирует:
List<String> list = new ArrayList<>(); list.add("A"); // The following statement should fail since addAll expects // Collection<? extends String> list.addAll(new ArrayList<>());
Отметьте, что ромб часто работает в вызовах метода; однако, предлагается, чтобы Вы использовали ромб прежде всего для объявлений переменной.
В сравнении, следующих компиляциях в качестве примера:
// The following statements compile: List<? extends String> list2 = new ArrayList<>(); list.addAll(list2);
Отметьте, что конструкторы могут быть универсальными (другими словами, объявите их собственные формальные параметры типа), и в универсальных и в неуниверсальных классах. Рассмотрите следующий пример:
class MyClass<X> { <T> MyClass(T t) { // ... } }
Рассмотрите следующее инстанцирование класса MyClass
, который допустим в Java SE 7 и предшествующие выпуски:
new MyClass<Integer>("")
Этот оператор создает экземпляр параметризованного типа MyClass<Integer>
; оператор явно определяет тип Integer
для формального параметра типа, X
, из универсального класса MyClass<X>
. Отметьте, что конструктор для этого универсального класса содержит формальный параметр типа, T
. Компилятор выводит тип String
для формального параметра типа, T
, из конструктора этого универсального класса (потому что фактический параметр этого конструктора является a String
объект).
Компиляторы от выпусков до Java SE 7 в состоянии вывести фактические параметры типа универсальных конструкторов, подобных универсальным методам. Однако, компилятор в Java, SE 7 может вывести фактические параметры типа универсального класса, который инстанцируют, если Вы используете ромб (<>
). Рассмотрите следующие примеры, которые допустимы для Java SE 7 и позже:
MyClass<Integer> myObject = new MyClass<>("");
В этом примере компилятор выводит тип Integer
для формального параметра типа, X
, из универсального класса MyClass<X>
. Это выводит тип String
для формального параметра типа, T
, из конструктора этого универсального класса.
MyClass<Integer> myObject = new <String> MyClass<>("");
В этом примере компилятор выводит тип Integer
для формального параметра типа, X
, из универсального класса MyClass<X>
. Оператор явно определяет тип String
для формального параметра типа, T
, из конструктора этого универсального класса.