55
votes

I see that traits in Scala are similar to interfaces in Java (but interfaces in Java extend other interfaces, they don't extend a class). I saw an example on SO about traits usage where a trait extends a class.

What is the purpose of this? Why can traits extend classes?

1
If you read the answer you linked, you'll see that traits are very dissimilar to interfaces, since they can contain implementations.Jan Hudec
You might also be interested in the difference between trait inheritance and self-type annotations: stackoverflow.com/questions/1990948/…Malte Schwerhoff
Yes, I understood the point that traits, unlike interfaces can contain partial implementation of methods, but I wasn't sure about the purpose of traits extending classes (as explained in the example)Raj

1 Answers

71
votes

Yes they can, a trait that extends a class puts a restriction on what classes can extend that trait - namely, all classes that mix-in that trait must extend that class.

scala> class Foo
defined class Foo

scala> trait FooTrait extends Foo
defined trait FooTrait

scala> val good = new Foo with FooTrait
good: Foo with FooTrait = $anon$1@773d3f62

scala> class Bar
defined class Bar

scala> val bad = new Bar with FooTrait
<console>:10: error: illegal inheritance; superclass Bar
 is not a subclass of the superclass Foo
 of the mixin trait FooTrait
       val bad = new Bar with FooTrait
                              ^