Ответ 1
Сначала: определить подстановку.
[A1:=S1,...,An:=Sn]
является замена в нотации JLS (§ 1.3), определяемая как:
Обозначение
[F1:=T1,...,Fn:=Tn]
означает заменуFi
наTi
для1 ≤ i ≤ n
.
Заявление: [A1:=S1,...,An:=Sn]
- это замена параметра типа (G
) Ai
для переменной типа Si
для 1 ≤ i ≤ n
. (также см. сноску †)
Далее: рассмотрим, почему нам понадобится замена в первом случае. Из §5.1.10 (выделение добавлено для перехода домой в следующую точку):
Пусть
G
назовите объявление типового типа... сn
введите параметрыA1,...,An
с соответствующими границамиU1,...,Un
.
То есть:
- оценки
U1,...,Un
соответствуют параметрам типаA1,...,An
. - неустановленное следствие: оценки
U1,...,Un
не соответствуют переменным типаS1,...,Sn
.
Объединяя его: я сейчас заявляю очевидное, поскольку я уверен, что вы опередили меня, но...
Относительно правила для "Ti
является аргументом типа подстановки... формы ?
" )
Si
- это новая переменная типа, верхняя граница которойUi [A1:=S1,...,An:=Sn]
-
Si
- это переменная типа - верхняя граница которой
Ui
- где (это подразумеваемый бит)
- введите параметры
A1,...,An
, которыеU1,...,Un
соответствуют конкретно - были заменены переменными типа
S1,...,Sn
- make
U1,...,Un
соответствуют переменным типаS1,...,Sn
TL; DR
то есть. Это просто означает, что исходная верхняя граница Ui
также является верхней границей для Si
Сноски
† Полезно вспомнить из JLS что переменные типа и параметры типа не одно и то же (поэтому мы можем начать понимать, зачем нам нужна замена):
Переменная типа - это неквалифицированный идентификатор, используемый как тип в классе, интерфейсе, методе, и тела конструктора.
Переменная типа вводится объявлением параметра типа общего класса, интерфейса, метода или конструктора.