18

在 Scala 中,什么是

trait A <: B

意思是?是不是一样

trait A extends B

?

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

4

5 回答 5

19

注意从 Scala 2.12.5 开始,不推荐使用<:forextends

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’ | ‘&lt;:’

更新它是在r14632中引入的。使用编译器选项-Xexperimental,它将特征标记为抽象,以与建议的语言特性Virtual Traits一起使用。如果没有-Xexperimental,它是“扩展”的同义词,仅允许用于特征。

于 2010-01-23T17:31:10.897 回答
11

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

于 2010-02-19T11:04:58.227 回答
4

查看Scala Language Specification,它似乎意味着同样的事情。trait 的描述只提到了trait A extends B语法。但是 Scala 语法摘要使用extends<:可互换的特征定义:

TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘&lt;:’ 
于 2010-01-23T18:20:41.480 回答
3

是的,差不多,请参阅这篇文章了解更多信息。从语言规范中,我们看到以下定义:

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

类型等价 T ≡ UT 和 U 在所有情况下都可以互换。

一致性 T <: U 类型 T 符合类型 U 。

编辑:查看语言规范,它似乎是相同的,特别是它被定义为<:extends

ClassTemplateOpt ::= Extends ClassTemplate | [[Extends] TemplateBody]
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘&lt;:’
于 2010-01-23T16:10:13.213 回答
0

请注意,从 Scala 2.12.5 开始

不推荐使用<:forextends

$ 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
于 2018-08-20T07:11:31.877 回答