В Скале, что делает
trait A <: B
средний? Это все равно как
trait A extends B
?
Отредактированный, чтобы добавить: я знаком с синтаксисом для параметров типа, и что <:
средства в том контексте. Однако в вышеупомянутом примере это казалось бы мне этим A
название объявляемой черты, не параметр типа.
ПРИМЕЧАНИЕ Начиная с версии Scala 2.12.5 использование <:
для extends
deprecated
scala -deprecation -e 'trait B; trait A <: B'
/var/folders/0w/kb0d3rqn4zb9fcc91pxhgn8w0000gn/T/scalacmd2374381600671257557.scala:1: warning: Using `<:` for `extends` is deprecated
trait B; trait A <: B
^
one warning found
Seems to compile to the same thing.
~/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
, это синоним для 'extended', который разрешен только для трейтов.
, глядя на спецификацию Scala Language , похоже, это означает то же самое. Описание черты упоминает только черту Extends B
синтаксис. Но Scala Syntax Summary использует продлен
и <:
взаимозаменяемо для определений чертов:
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘<:’
Да, ну, почти, см. эту статью для получения более подробной информации. Из языковой спецификации мы видим следующее определение:
Мы определяем два вида отношений.
Эквивалентность типов Т ≡ U T и U взаимозаменяемы во всех контекстах.
Соответствие T <: U Тип T соответствует типу U .
Редактирование: Если посмотреть на спецификацию языка, то окажется, что <:
и extensions
одинаковы, в частности, это определяется как:
ClassTemplateOpt ::= Extends ClassTemplate | [[Extends] TemplateBody]
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘<:’
Синтаксис <: зарезервирован для будущего использования в виртуальных классах (которые еще не реализованы).