Обозначение 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 имела еще более бессмысленную версию той же записи.

4,5. Параметризованные типы

Объявление общего класса или интерфейса 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,

Другие вопросы по тегам