在Scala中,什麼是「特質A <:B」是什麼意思?
trait A <: B
是什麼意思?是否與
trait A extends B
?
修改爲添加:我熟悉類型參數的語法,以及在該上下文中的含義,<:
。然而,在上面的例子中,在我看來,A
是正在聲明的特徵的名稱,而不是類型參數。
在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