Что означает "признак 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’ | ‘<:’