“特质A<:B”是什么意思?

时间:2010-01-23 15:38:12

标签: inheritance scala traits

在Scala中,

是什么
trait A <: B

意思?它和

是一样的吗?
trait A extends B

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

5 个答案:

答案 0 :(得分:18)

注意从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 Traits”中解释这一点。但语法摘要确实提到了这一点。

TraitDef ::= id [TypeParamClause] TraitTemplateOpt 
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘<:’

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

答案 1 :(得分:11)

&lt ;:语法保留供将来在虚拟类中使用(尚未实现)。

答案 2 :(得分:4)

Scala Language Specification,似乎意味着同样的事情。 trait的描述仅提到trait A extends B语法。但Scala语法摘要可以交替使用extends<:进行特征定义:

TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘<:’ 

答案 3 :(得分:3)

是的,差不多,请参阅this article了解更多信息。从language spec开始,我们看到以下定义:

  

我们定义了两种类型之间的关系。

     

类型等价T≡UT和U在所有上下文中都是可互换的。

     

一致性T&lt ;:U Type T符合U型。

修改:查看语言规范,<:extends相同,特别是定义为:

ClassTemplateOpt ::= Extends ClassTemplate | [[Extends] TemplateBody]
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘<:’

答案 4 :(得分:0)

请注意,从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