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.

War es hilfreich?

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ür extends 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top