Skip to content

Commit eb71997

Browse files
authored
Merge pull request #11338 from dotty-staging/fix-11214
Allow to define trait parameters via overrides
2 parents 16bf86f + 0823a8f commit eb71997

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

docs/docs/reference/other-new-features/trait-parameters.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,14 @@ class D extends C, Greeting("Bill") // error: parameter passed twice
2626
Should this print "Bob" or "Bill"? In fact this program is illegal,
2727
because it violates the second rule of the following for trait parameters:
2828

29-
1. If a class `C` extends a parameterized trait `T`, and its superclass does not, `C` _must_ pass arguments to `T`.
29+
1. If a class `C` directly extends a parameterized trait `T`, and its superclass does not, `C` _must_ pass arguments to `T`.
3030

31-
2. If a class `C` extends a parameterized trait `T`, and its superclass does as well, `C` _must not_ pass arguments to `T`.
31+
2. If a class `C` directly or indirectly extends a parameterized trait `T`, and its superclass does as well, `C` _must not_ pass arguments to `T`.
3232

3333
3. Traits must never pass arguments to parent traits.
3434

35+
4. If a class `C` extends a parameterized trait `T` only indirectly, and its superclass does not extend `T`, then all parameters of `T` must be defined via overrides.
36+
3537
Here's a trait extending the parameterized trait `Greeting`.
3638

3739
```scala
@@ -51,6 +53,13 @@ The correct way to write `E` is to extend both `Greeting` and
5153
```scala
5254
class E extends Greeting("Bob"), FormalGreeting
5355
```
56+
Alternatively, a class could also define the `name` parameter of `Greeting` using
57+
an override, using rule (4) above:
58+
59+
```scala
60+
class E2 extends FormalGreeting:
61+
override val name: String = "Bob"
62+
```
5463

5564
## Reference
5665

tests/pos/i11214.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
trait Pet(val name: String)
2+
trait FeatheredPet extends Pet
3+
4+
class Bird(override val name: String) extends FeatheredPet:
5+
override def toString = s"bird name: $name"

0 commit comments

Comments
 (0)