Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

Вывод типа для Универсального Создания Экземпляра

Можно заменить параметры типа, требуемые вызвать конструктора универсального class с пустым множеством параметров типа (<>) пока компилятор может вывести параметры типа от контекста. Эту пару угловых скобок неофициально вызывают ромбом.

Например, рассмотрите следующее объявление переменной:

Map<String, List<String>> myMap = new HashMap<String, List<String>>();

В Java SE 7, можно заменить параметризованным типом конструктора с пустым множеством параметров типа (<>):

Map<String, List<String>> myMap = new HashMap<>();

Отметьте, что, чтобы использовать в своих интересах автоматический вывод типа во время универсального инстанцирования class, следует определить ромб. В следующем примере компилятор генерирует преобразование непроверенное, предупреждающее потому что 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) {
    // ...
  }
}

Рассмотрите следующее инстанцирование class MyClass, который допустим в Java SE 7 и предшествующие выпуски:

new MyClass<Integer>("")

Этот оператор создает экземпляр параметризованного типа MyClass<Integer>; оператор явно определяет тип Integer для формального параметра типа, X, из универсального class MyClass<X>. Отметьте, что конструктор для этого универсального class содержит формальный параметр типа, T. Компилятор выводит тип String для формального параметра типа, T, из конструктора этого универсального class (потому что фактический параметр этого конструктора является a String объект).

Компиляторы от выпусков до Java SE 7 в состоянии вывести фактические параметры типа универсальных конструкторов, подобных универсальным методам. Однако, компилятор в Java, SE 7 может вывести фактические параметры типа универсального class, который инстанцируют, если Вы используете ромб (<>). Рассмотрите следующий пример, который допустим для Java SE 7 и позже:

MyClass<Integer> myObject = new MyClass<>("");

В этом примере компилятор выводит тип Integer для формального параметра типа, X, из универсального class MyClass<X>. Это выводит тип String для формального параметра типа, T, из конструктора этого универсального class.


Oracle и/или его филиалы Авторское право © 1993, 2012, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами