Что означает "черта 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
Другие вопросы по тегам