Предположим, что класс B
наследует от класса A
. Ниже приведена юридическая Java:
List<A> x;
List<? super B> y = x;
В терминах спецификации это означает, что List<A>
присваивает значение List<? super B>
. Однако мне трудно найти часть спецификации, которая говорит, что это законно. В частности, я считаю, что мы должны иметь отношение подтипа
List<A> <: List<? super B>
но раздел 4.10 спецификации Java 8 определяет отношение подтипа как транзитивное замыкание прямого отношения супертипа S >1 T
и определяет прямое отношение супертипа в терминах конечной функции, которая вычисляет набор супертипов T
. Не существует ограниченной функции, которая на входе List<A>
может производить List<? super B>
, так как может быть произвольное число B
, которое наследуется от A
, поэтому определение подтипа spec, похоже, разбивается на суперсимволы. В разделе 4.10.2 "Подтипирование между классами и типами интерфейсов" упоминаются подстановочные знаки, но он обрабатывает только другое направление, в котором подстановочный знак появляется в потенциальном подтипе (это направление вписывается в вычисленный механизм прямого супертипа).
Вопрос. Какая часть спецификации говорит, что вышеуказанный код является законным?
Мотивация - это код компилятора, поэтому этого недостаточно, чтобы понять, почему это законно интуитивно или придумать алгоритм, который его обрабатывает. Поскольку общая проблема подтипирования в Java неразрешима, я хотел бы обрабатывать точно те же случаи, что и спецификация, и поэтому хочу, чтобы часть спецификации обрабатывала этот случай.