Подстановочный знак (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]
литература
- Спецификация языка Java , третье издание. Вс, ISBN 978-0-321-24678-3
веб ссылки
- Дженерики . Учебники по Java
- Совместимость типов в Java
Индивидуальные доказательства
- ↑ Джеймс Гослинг и др. а .: Глава 4. Типы, значения и переменные. 4.5.1. Введите аргументы и подстановочные знаки. В: Спецификация языка Java. 28 февраля 2013, доступ к 14 января 2013 .