What does “trait A <: B” mean?

后端 未结 5 956
情歌与酒
情歌与酒 2020-12-15 06:14

In Scala, what does

trait A <: B

mean? Is it just the same as

trait A extends B

?

Edit

相关标签:
5条回答
  • 2020-12-15 06:55

    The <: syntax is reserved for future use in virtual classes (which are not implemented yet).

    0 讨论(0)
  • 2020-12-15 07:16

    NOTE As of Scala 2.12.5 using <: for extends is deprecated

    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
    

    Seems to compile to the same thing.

     ~/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    
    

    The spec doesn't explain this in "5.3.3 Traits". But the Syntax Summary does mention this.

    TraitDef ::= id [TypeParamClause] TraitTemplateOpt 
    TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
    Extends ::= ‘extends’ | ‘<:’
    

    UPDATE It was introduced in r14632. With the compiler option -Xexperimental it marks the trait as abstract, for use with a proposed language feature Virtual Traits. Without -Xexperimental, it is a synonym for 'extends' that is allowed only for traits.

    0 讨论(0)
  • 2020-12-15 07:19

    Looking at the Scala Language Specification, it seems to mean the same thing. The description for trait only mentions the trait A extends B syntax. But the Scala syntax summary uses extends and <: interchangeably for trait definitions:

    TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
    Extends ::= ‘extends’ | ‘<:’ 
    
    0 讨论(0)
  • 2020-12-15 07:20

    Yes, well, almost, see this article for a little more information. From the language spec, we see the following definition:

    We define two relations between types.

    Type equivalence T ≡ U T and U are interchangeable in all contexts.

    Conformance T <: U Type T conforms to type U .

    Edit: Looking into the language spec it appears that <: and extends are the same, in particular it is defined as:

    ClassTemplateOpt ::= Extends ClassTemplate | [[Extends] TemplateBody]
    TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody]
    Extends ::= ‘extends’ | ‘<:’
    
    0 讨论(0)
  • 2020-12-15 07:21

    Please note that as of Scala 2.12.5:

    Using <: for extends is 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
    
    0 讨论(0)
提交回复
热议问题