2015-11-04 3 views
3

В разделе 4.5 JLS (Parameterized Types) упоминается следующее обозначение: S[F1:=T1,...,Fn:=Tn].Обозначение S [F1: = T1, ..., Fn: = Tn] в JSL

Я точно не понимаю смысл этой нотации.

Он упоминается в следующем пункте:

Базовый тип имеет тип параметров F1, ..., Fn с соответствующими границами B1, ..., Bn. Каждый аргумент типа Ti параметризованного типа охватывает более всех типов, которые являются подтипами всех типов, перечисленных в соответствующей строке . То есть для каждого связанного типа S в Bi Ti является подтипом S [F1: = T1, ..., Fn: = Tn] (§ 4.10).

Смысл приведенного выше высказывания ясен.

Но это не для меня ясно, почему мы имеем [F1:=T1,...,Fn:=Tn] после S

ответ

0

Это выглядит неправильно.

Во-первых: без заключенной в квадратные скобки части предложение является правильным повторением предыдущего утверждения, и оба соответствуют моему пониманию языка java.

Во-вторых: обозначения ошибочны. В § 4.10 ссылки на подтипирование и надтипирование нотации <: и:>, но на самом деле используется замещающая нотация: = (фактически не обозначенная как замещающая нотация в версии 8, но имевшаяся в версии 7 и используемая как замена в других разделах документ).

Наконец: предыдущая версия JSL имела еще более бессмысленную версию той же нотации.

4.5. Parameterized Types

Общий класс или интерфейс декларация С (§8.1.2, §9.1.2) с одним или несколькими параметров типа А1, ..., An, которые имеют соответствующие границы В1, ..., Bn определяет набор параметризованных типов, по одному для каждого возможного вызова типа параметра.

Каждый параметризованный тип в наборе имеет вид C, где каждый аргумент типа Ti охватывает все типы, которые являются подтипами всех типов , перечисленных в соответствующей строке. То есть для каждого связанного типа Si в Bi Ti является подтипом Si [F1: = T1, ..., Fn: = Tn].

Он имеет те же скобки, но на этот раз даже не упоминает, что F до использования в скобках.

Похоже, что скобки были скопированы неправильно, когда этот раздел был переписан между версиями 6 и 7. Версия 6 имеет скобки, но просто означает, что проверка границ выполняется для каждого параметра типа.

+0

Также здесь индексируется 'Si' (в JLS8 мы имеем' S'). Похоже, что Si [F1: = T1, ..., Fn: = Tn] является просто Bi (т. Е. Другая форма обозначения Bi) – Vitaly

+1

Не совсем. Каждый параметр типа (Fi) имеет единственную границу (Bi), но каждая граница может сама перечислить несколько типов (S). Из этих типов только один может быть классом, но граница может включать несколько типов интерфейсов. – ILMTitan

+0

Теперь это выглядит ясно. Если, например, 'Bi = MyClass & MyInterface', то' S [F1: = T1, ..., Fn: = Tn] 'shoud будет либо' MyClass', либо 'MyInterface' – Vitaly

0

Здесь ıA моего мышления.

Обозначение [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.