Подстановочный знак (Java)

Подстановочный (редко также джокер ) ?является специальным текущим параметром типа в Java для инстанцирования генерических (параметризованные) типов . В этой статье изложены основные правила его использования.

Ковариация для родовых типов

В отличие от массивов (которые ковариантны в Java ), разные экземпляры универсального типа несовместимы друг с другом (даже явно): согласно соглашениям компилятор сообщает об ошибке как для преобразований (приведения), так и для . Generisch<Obertyp> oberGenerisch; Generisch<Untertyp> unterGenerisch;(Generisch<Untertyp>)oberGenerisch(Generisch<Obertyp>)unterGenerisch

Эту несовместимость можно смягчить с помощью подстановочного знака, если ?для параметра текущего типа используется следующее : - абстрактный супертип всех экземпляров универсального типа. Это означает, что этого типа можно создавать только ссылки, но не объекты. Смысл такой ссылки в том, что любые экземпляры соответствуют ей. Generisch<?>Generisch

Подстановочный знак как тип параметра

В теле универсального модуля параметр типа Objectобрабатывается как верхняя граница (если не ограничено, то как ). Если тип результата (тип возвращаемого значения) функции является параметром типа, результат (например, типа ?) может быть передан в ссылку типа ограничения ( Objectесли нет ограничения). С другой стороны, никакой другой тип не подходит под шаблонный тип, даже Object: если ?метод использовался для типа формального параметра, никакие текущие параметры не могут быть переданы ему. Тогда его можно будет вызвать только после преобразования (приведения) подстановочной ссылки:

class Generisch<T extends Schranke> {
    private T t;
    void schreiben(T t) { this.t = t; }
    T lesen() { return t; }
}
...
Generisch<?> jokerReferenz;
Schranke o = jokerReferenz.lesen(); // Object wäre auch OK
jokerReferenz.schreiben(new Object()); // Typfehler
((Generisch<Schranke>)jokerReferenz).schreiben(new Schranke()); // OK

Ограничение по шаблону

Не только параметр формального типа, но и подстановочный знак может быть (дополнительно) ограничен сверху, если вы не хотите поддерживать совместимость произвольных экземпляров:

Generisch<? extends UntertypVonSchranke> vonObenEingeschränkteReferenz;

Теперь Generischк этой ссылке можно прикрепить экземпляр , где текущий параметр типа является подтипом UntertypVonSchranke. В ограничении снизу

Generisch<? super UntertypVonSchranke> vonUntenEingeschränkteReferenz;

GenerischИнстанцирование из любого надтипа (например Schranke) из могут быть UntertypVonSchrankeприсоединены. Поэтому возможно, что разрешенные типы ограничены с двух сторон: сверху объявлением класса ( ), снизу объявлением ссылки ( ). extends Schrankesuper UntertypVonSchranke

Создание объекта с использованием подстановочных знаков

Хотя объекты не могут быть созданы из экземпляров с подстановочными знаками (это запрещено, потому что это абстрактно), объекты массива могут быть созданы только из неограниченных экземпляров с подстановочными знаками (т. Е. Никаких других общих экземпляров): правильно, пока запрещено. new Generisch<?>()Generisch<?>new Generisch<?>[20]new Generisch<Schranke>[20]

литература

веб ссылки

Индивидуальные доказательства

  1. Джеймс Гослинг и др. а .: Глава 4. Типы, значения и переменные. 4.5.1. Введите аргументы и подстановочные знаки. В: Спецификация языка Java. 28 февраля 2013, доступ к 14 января 2013 .