ChatGPT解决这个技术问题 Extra ChatGPT

为什么 Scala trait 可以扩展一个类?

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?

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

T
Taky

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
                              ^

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.

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅