2010-01-23 74 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

的<:語法保留用於虛擬類(尚未實施)將來使用。