Обозначение S[F1:=T1,...,Fn:=Tn] в JSL
В разделе 4.5 JLS (параметризованные типы) упоминаются следующие обозначения:S[F1:=T1,...,Fn:=Tn]
,
Я не совсем понимаю значение этой записи.
Это упоминается в следующем абзаце:
Универсальный тип имеет параметры типа F1,...,Fn с соответствующими границами B1,...,Bn. Каждый аргумент типа Ti параметризованного типа охватывает все типы, которые являются подтипами всех типов, перечисленных в соответствующей границе. То есть для каждого связанного типа S в Bi Ti является подтипом S[F1:=T1,...,Fn:=Tn] (§4.10).
Смысл вышеприведенного утверждения ясен.
Но мне не понятно, почему мы имеем [F1:=T1,...,Fn:=Tn]
после S
2 ответа
Это выглядит неправильно для меня.
Во-первых: без заключенной в скобки части предложение является правильным повторением предыдущего утверждения, и оба соответствуют моему пониманию языка Java.
Второе: запись неверна. §4.10 ссылается на нотацию подтипов и супертипов <: и:>, но фактически используется нотация замены:= (фактически не определена как нотация замены в версии 8, но была в версии 7 и использовалась в качестве замены в других разделах документ).
Наконец: предыдущая версия JSL имела еще более бессмысленную версию той же записи.
Объявление общего класса или интерфейса C (§8.1.2, §9.1.2) с одним или несколькими параметрами типа A1,...,An, имеющими соответствующие границы B1,...,Bn, определяет набор параметризованных типов, один для каждого возможного вызова раздела параметров типа.
Каждый параметризованный тип в наборе имеет форму C, где каждый аргумент типа Ti охватывает все типы, которые являются подтипами всех типов, перечисленных в соответствующей границе. То есть для каждого связанного типа Si в Bi Ti является подтипом Si[F1:=T1,...,Fn:=Tn].
У него те же скобки, но на этот раз даже не упоминается, что F до использования в скобках.
Похоже, что скобки были скопированы неправильно, когда этот раздел был переписан между версиями 6 и 7. В версии 6 есть скобки, но просто означает, что проверка границ происходит для каждого параметра типа.
Здесь я думаю.
Запись [F1:=T1,...,Fn:=Tn]
является заменой каждого параметра типа Fi
с типом concete (или подстановочным знаком) Ti, i=1,2,...n
,
Общий класс можно рассматривать как функцию с (n+1)
аргументы f(F1,F2,...,Fn, S)
, где Fi
- это параметр типа и S
принадлежат следующему конечному множеству {B1,B2,...,Bn}
, Если мы заменим [F1:=T1,...,Fn:=Tn]
мы получаем функцию с одним аргументом:g(s)=f(T1,T2,...,Tn,S)
,
Учитывая, что [F1:=T1,...,Fn:=Tn]
это замена Fi
с Ti, i=1,2,...,n
мы можем ввести новые обозначения:f(T1,T2,...,Tn,S)=h(S)[F1=T1,...,Fn=Tn]
,
функция h(S)
должен быть линейным: h(S)=S
Наконец мы имеем:f(T1,T2,...,Tn,S)=S[F1=T1,...,Fn=Tn]
,
Отсюда и понятие S[F1=T1,...,Fn=Tn]
означает: получить один из верхней границы Bi
в фиксированных значениях Fi=Ti
,