Что делает “черту <: B” средний?

В Скале, что делает

trait A <: B

средний? Это все равно как

trait A extends B

?

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

17
задан Matt R 23 January 2010 в 16:48
поделиться

4 ответа

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

18
ответ дан 30 November 2019 в 11:52
поделиться

, глядя на спецификацию Scala Language , похоже, это означает то же самое. Описание черты упоминает только черту Extends B синтаксис. Но Scala Syntax Summary использует продлен и <: взаимозаменяемо для определений чертов:

TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘<:’ 
4
ответ дан 30 November 2019 в 11:52
поделиться

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

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

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

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

Редактирование: Если посмотреть на спецификацию языка, то окажется, что <: и extensions одинаковы, в частности, это определяется как:

ClassTemplateOpt ::= Extends ClassTemplate | [[Extends] TemplateBody]
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘<:’
3
ответ дан 30 November 2019 в 11:52
поделиться

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

11
ответ дан 30 November 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: