62

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?

3
  • 1
    If you read the answer you linked, you'll see that traits are very dissimilar to interfaces, since they can contain implementations. Commented Oct 12, 2012 at 8:26
  • 2
    You might also be interested in the difference between trait inheritance and self-type annotations: stackoverflow.com/questions/1990948/… Commented Oct 12, 2012 at 8:29
  • 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) Commented Oct 12, 2012 at 8:30

1 Answer 1

77

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 ^ 
Sign up to request clarification or add additional context in comments.

3 Comments

Interesting. But you can also restrict the classes into which a trait can be mixed by putting a type constraint on the self-type, e.g. trait FooTrait { self:Foo => }. When would you use one technique versus the other?
Scala gets pretty crazy with all the typing business. I can definitely see this could be pretty useful, but can anyone give any concrete examples?
@AmigoNico here is one example when you may prefer inheriting from a class.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.