Was bedeutet „Merkmal A <: B“ bedeuten?
-
22-09-2019 - |
Frage
In Scala, was bedeutet
trait A <: B
bedeuten? Ist es nur das gleiche wie
trait A extends B
Edited hinzufügen: Ich bin mit der Syntax für die Parameter des Typs vertraut sind, und welche <:
Mittel in diesem Zusammenhang. Jedoch in dem obigen Beispiel wäre es mir scheinen, dass A
ist der Name des Merkmals erklärt wird, kein Typ-Parameter.
Lösung
Hinweis Ab Scala 2.12.5 <:
für extends
wird nicht mehr unterstützt
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
Es scheint, auf die gleiche Sache zu kompilieren.
~/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
Die Spezifikation erklärt nicht, diese in "5.3.3 Traits". Aber die Syntax Zusammenfassung dies nicht erwähnt.
TraitDef ::= id [TypeParamClause] TraitTemplateOpt
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘<:’
UPDATE Es wurde in r14632 . Mit der Compiler-Option -Xexperimental
es markiert das Merkmal als abstraktes, für die Verwendung mit einer vorgeschlagenen Sprache-Funktion virtuelle Traits . Ohne -Xexperimental
, es ist ein Synonym für ‚erweitert‘, die nur für Züge erlaubt.
Andere Tipps
Die <:. Syntax für die zukünftige Verwendung in virtuellen Klassen reserviert ist (die noch nicht umgesetzt werden)
Mit Blick auf die Scala Language Specification , so scheint es zu bedeuten, das gleiche. Die Beschreibung der Eigenschaft erwähnt nur die trait A extends B
Syntax. Aber die Scala-Syntax Zusammenfassung Anwendungen extends
und <:
austauschbar für Charakterzug Definitionen:
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘<:’
Ja, na ja, fast finden Sie unter diesem Artikel für ein wenig mehr Informationen. Von der Sprache spec sehen wir die folgende Definition:
Wir definieren zwei Beziehungen zwischen den Arten.
Typ Äquivalenz T ≡ U T und U sind in allen Kontexten austauschbar.
Conformance T <. U Typ T Konform U eingeben
Bearbeiten : Ein Blick in die Sprache spec es, dass <:
erscheint und extends
sind die gleichen, insbesondere wird es wie folgt definiert:
ClassTemplateOpt ::= Extends ClassTemplate | [[Extends] TemplateBody]
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
Extends ::= ‘extends’ | ‘<:’
Bitte beachten Sie, dass der Scala 2.12.5 :
Mit
<:
fürextends
ist deprecated
$ 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