"特征A <:B"是什么意思?

Mat*_*t R 17 inheritance scala traits

在Scala中,有什么用

trait A <: B
Run Code Online (Sandbox Code Playgroud)

意思?它和它一样吗?

trait A extends B
Run Code Online (Sandbox Code Playgroud)

编辑添加:我熟悉类型参数的语法,以及<:在该上下文中的含义.但是,在上面的例子中,我认为这A是被声明的特征的名称,而不是类型参数.

ret*_*nym 18

注意从Scala 2.12.5开始使用<:for 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
Run Code Online (Sandbox Code Playgroud)

似乎编译成同样的事情.

 ~/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    
Run Code Online (Sandbox Code Playgroud)

该规范没有在"5.3.3特征"中解释这一点.但语法摘要确实提到了这一点.

TraitDef ::= id [TypeParamClause] TraitTemplateOpt 
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘<:’
Run Code Online (Sandbox Code Playgroud)

更新它是在r14632中引入的.使用编译器选项,-Xexperimental它将特征标记为抽象,以与建议的语言特征虚拟特征一起使用.没有-Xexperimental,它是'extends'的同义词,只允许特征.

  • 取决于你看的规格的哪一部分!语法摘要附录说,"Extends :: ='extends'|'<:'" (5认同)

Adr*_*ors 11

<:语法保留供将来在虚拟类中使用(尚未实现).