Что означает «черта A <: B»? - PullRequest
17 голосов
/ 23 января 2010

В Scala, что означает

trait A <: B

означает? Это так же, как

trait A extends B

Отредактировано, чтобы добавить: Я знаком с синтаксисом параметров типа и тем, что <: означает в этом контексте. Однако в приведенном выше примере мне может показаться, что A - это имя декларируемой черты, а не параметр типа.

Ответы [ 5 ]

18 голосов
/ 23 января 2010

ПРИМЕЧАНИЕ Начиная с 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», который разрешен только для черт.

11 голосов
/ 19 февраля 2010

Синтаксис <: зарезервирован для будущего использования в виртуальных классах (которые еще не реализованы). </p>

4 голосов
/ 23 января 2010

Глядя на Scala Language Specification , кажется, это означает то же самое. В описании черты упоминается только синтаксис trait A extends B. Но в сводке синтаксиса Scala для определений признаков используются extends и <::

TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘<:’ 
3 голосов
/ 23 января 2010

Да, ну, почти, см. эту статью , чтобы узнать немного больше. Из спецификации языка мы видим следующее определение:

Мы определяем два отношения между типами.

Эквивалентность типов T ≡ U T и U взаимозаменяемы во всех контекстах.

Соответствие T <: U Тип T соответствует типу U. </p>

Редактировать : При изучении языковой спецификации выясняется, что <: и extends одинаковы, в частности, она определяется как:

ClassTemplateOpt ::= Extends ClassTemplate | [[Extends] TemplateBody]
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘<:’
0 голосов
/ 20 августа 2018

Обратите внимание, что по состоянию на 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
...