Scala 3's multiple inheritance is a bit different from Scala 2's. It feels quirky in the context of Scala 2, but the rules are easier to understand. Traits can now take parameters, but you're only allowed to apply them in the extends clause of a class (not another trait).
-
Show this thread
-
An inheritance hierarchy between traits will be "parameterless" inheritance, so the linearization order is not so significant, and the type system now provides a sound way to combine multiple transitive inheritances of the same trait (which may have different type parameters).
1 reply 0 retweets 2 likesShow this thread -
Class-to-class inheritance is always single-inheritance, so there's never any ambiguity when applying the value parameters, though there may still be a need to resolve conflicts in concrete implementations.
1 reply 0 retweets 0 likesShow this thread -
A new error will occur with code like this: trait Foo(x: Int) trait Bar extends Foo // not allowed to extend Foo(0)! class Baz() extends Bar We are told that we need to explicitly specify the inheritance of Foo with its parameter, like so: class Baz() extends Bar, Foo(0)
1 reply 0 retweets 2 likesShow this thread -
You also get to use commas to separate the list of inherited traits.
3 replies 0 retweets 2 likesShow this thread -
-
Replying to @kai_nyasha
Really, why? Because it's performing a function too similar to `&` and `with`?
1 reply 0 retweets 0 likes -
Replying to @propensive
Well yeah, because there's already `with`. I think you can't use `&` in extends clause.
1 reply 0 retweets 0 likes -
Replying to @kai_nyasha
No, you can't use `&`. It needs to be something different because the order of inheritance is significant, whereas `&` doesn't imply any order (in other uses). I hope `with` gets phased out instead—I think that's the plan, anyway.
1 reply 0 retweets 0 likes -
Replying to @propensive
I don't think `with` can be phased out because of ambiguity with tuples. e.g. trait X; object X def x = (new X, X) Is it `x: X` or `x: (X, X.type)` ? So I hope `,` gets reconsidered as an ill-thought-out experiment :P
2 replies 0 retweets 2 likes
That's annoying... But there's more than one way to create a tuple... (new X) *: X *: () It would seem a shame to require a whole keyword to work around an ambiguity which already has an alternative. But I guess I just never liked seeing `with` five times in a row.
-
-
Replying to @propensive @kai_nyasha
Having said that, I'm not sure this is the only case where `with` is necessary, but I can't remember where else I had to use it...
1 reply 0 retweets 0 likes -
Replying to @propensive
Well another use for commas is parameter lists, so function application is also ambiguous - `f(new X, X)`. Obviously any such issues can be worked around e.g. `f({ new X, X })` but I don't really see any upsides to this syntax tbh and numerous downsides...
0 replies 0 retweets 3 likes
End of conversation
New conversation -
Loading seems to be taking a while.
Twitter may be over capacity or experiencing a momentary hiccup. Try again or visit Twitter Status for more information.