“特质A <:B”是什么意思?
在Scala中,什么是“特质A <:B”是什么意思?
trait A <: B
是什么意思?是否与
trait A extends B
?
修改为添加:我熟悉类型参数的语法,以及在该上下文中的含义,<:
。然而,在上面的例子中,在我看来,A
是正在声明的特征的名称,而不是类型参数。
似乎编译为同样的事情。
~/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
,它是“扩展”的同义词,只允许用于特征。
取决于您所看到的规范的哪一部分!语法摘要附录说:“扩展:: ='扩展'|' 2010-01-23 17:47:57
我提出了一个规范的错误:https://lampsvn.epfl.ch/trac/scala/ticket/2953 – retronym 2010-01-23 17:56:00
另请参见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
是的,差不多,请参阅了解更多信息。从language spec,我们看到如下定义:
我们定义了两种类型之间的关系。
类型等价T≡U T和U在所有上下文中都是可以互换的。
一致性T <:U型T符合U型。
编辑:展望似乎<:
和extends
是相同的,尤其是它被定义为语言规范:
ClassTemplateOpt ::= Extends ClassTemplate | [[Extends] TemplateBody]
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘<:’
看着Scala Language Specification,这似乎意味着同样的事情。对性状的描述仅提到trait A extends B
语法。但是斯卡拉语法总结使用extends
和<:
互换的特征定义:
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘<:’
的<:语法保留用于虚拟类(尚未实施)将来使用。
我认为这意味着B在微笑A – 2010-01-23 15:42:50
FWIW,我的安装2.7.5不允许它。 – 2010-01-23 17:44:26
我使用2.8快照(2.8.0.r20331-b20100101020206) – 2010-01-23 17:51:36