2010-01-23 75 views
15

在Scala中,什么是“特质A <:B”是什么意思?

trait A <: B 

是什么意思?是否与

trait A extends B 

修改为添加:我熟悉类型参数的语法,以及在该上下文中的含义,<:。然而,在上面的例子中,在我看来,A是正在声明的特征的名称,而不是类型参数。

+28

我认为这意味着B在微笑A – 2010-01-23 15:42:50

+1

FWIW,我的安装2.7.5不允许它。 – 2010-01-23 17:44:26

+0

我使用2.8快照(2.8.0.r20331-b20100101020206) – 2010-01-23 17:51:36

回答

17

似乎编译为同样的事情。

~/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特征”中解释这一点。但Syntax Summary确实提到了这一点。

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

UPDATE它是在r14632介绍。使用编译器选项-Xexperimental它将特征标记为抽象,用于提议的语言特征Virtual Traits。没有-Xexperimental,它是“扩展”的同义词,只允许用于特征。

+5

取决于您所看到的规范的哪一部分!语法摘要附录说:“扩展:: ='扩展'|'<:'” – 2010-01-23 17:47:57

+0

我提出了一个规范的错误:https://lampsvn.epfl.ch/trac/scala/ticket/2953 – retronym 2010-01-23 17:56:00

+0

另请参见http ://lampsvn.epfl.ch/trac/scala/export/20327/scala/branches/devel-base-2.8.0/SIP/virtual-traits/sip-0000X.xhtml – 2010-01-23 18:23:23

3

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

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

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

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

编辑:展望似乎<:extends是相同的,尤其是它被定义为语言规范:

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

看着Scala Language Specification,这似乎意味着同样的事情。对性状的描述仅提到trait A extends B语法。但是斯卡拉语法总结使用extends<:互换的特征定义:

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

的<:语法保留用于虚拟类(尚未实施)将来使用。