19

In Scala, what does

trait A <: B

mean? Is it just the same as

trait A extends B

?

Edited to add: I'm familiar with the syntax for type parameters, and what <: means in that context. However, in the above example it would seem to me that A is the name of the trait being declared, not a type parameter.

Matt R
  • 9,892
  • 10
  • 50
  • 83

5 Answers5

19

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.

Jacek Laskowski
  • 72,696
  • 27
  • 242
  • 420
retronym
  • 54,768
  • 12
  • 155
  • 168
  • 5
    Depends which part of the spec you look at! The syntax summary appendix says, "Extends ::= ‘extends’ | ‘<:’" – Matt R Jan 23 '10 at 17:47
11

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

Adriaan Moors
  • 4,256
  • 1
  • 18
  • 10
4

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’ | ‘<:’ 
huynhjl
  • 41,520
  • 14
  • 105
  • 158
3

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’ | ‘<:’
Paul Wagland
  • 27,756
  • 10
  • 52
  • 74
0

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
Jacek Laskowski
  • 72,696
  • 27
  • 242
  • 420