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