Что означает "признак A <: B"?
В Scala что делает
trait A <: B
означает? Точно так же, как
trait A extends B
?
Отредактировано для добавления: Я знаком с синтаксисом для параметров типа, и что <:
означает в этом контексте. Однако в приведенном выше примере мне кажется, что A
- это имя объявляемого признака, а не параметр типа.
Ответы
Ответ 1
Кажется, нужно скомпилировать то же самое.
~/code/scratch: scala -Xprint:typer -e 'trait B; trait A <: B'
// snip
abstract trait B extends scala.AnyRef;
abstract trait A extends java.lang.Object with this.B
~/code/scratch: scala -Xprint:typer -e 'trait B; trait A extends B'
// snip
abstract trait B extends scala.AnyRef;
abstract trait A extends java.lang.Object with this.B
Спецификация не объясняет это в "5.3.3" Черты ". Но в резюме синтаксиса упоминается об этом.
TraitDef ::= id [TypeParamClause] TraitTemplateOpt
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘<:’
UPDATE Он был введен в r14632. С опцией компилятора -Xexperimental
он отмечает признак как абстрактный, для использования с предлагаемой функцией языка Virtual Traits. Без -Xexperimental
это синоним "extends", который допускается только для признаков.
Ответ 2
Синтаксис <: зарезервирован для будущего использования в виртуальных классах (которые еще не реализованы).
Ответ 3
Да, ну, почти, см. эту статью за небольшую дополнительную информацию. Из спецификация языка, мы видим следующее определение:
Мы определяем два отношения между типами.
Типовая эквивалентность T ≡ U T и U взаимозаменяемы во всех контекстах.
Соответствие T <: U Тип T соответствует типу U.
Изменить. Изучая спецификацию языка, кажется, что <:
и extends
совпадают, в частности, он определяется как:
ClassTemplateOpt ::= Extends ClassTemplate | [[Extends] TemplateBody]
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘<:’
Ответ 4
Глядя на Scala Спецификация языка, это, похоже, означает одно и то же. В описании для признака упоминается только синтаксис trait A extends B
. Но синтаксис Scala использует extends
и <:
взаимозаменяемые для определения признаков:
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘<:’