admin管理员组

文章数量:1307576

The following scala3 code compiles:

    trait Product

    trait Provider[+P <: Product] {
        def provide: P
    }

    class Outer extends Provider[Outer#Inner] {
        override def provide: Inner = new Inner
        class Inner extends Product
    }

    class DerivedOuter extends Outer {
        override def provide: DerivedInner = new DerivedInner
        class DerivedInner extends this.Inner
    }

But if DerivedOuter also extended any trait T[X] where X is a projection of a inner class of DerivedOuter, the compiler complains with a message that does not clarify the problem for me.

    class DerivedOuter extends Outer, Provider[DerivedOuter#DerivedInner] {
        override def provide: DerivedInner = new DerivedInner
        class DerivedInner extends this.Inner // <--- type `Inner` is not a member of `DerivedOuter`
    }

The problem arises when DerivedOuter also extends Provider[DerivedOuter#DerivedInner] (or any other trait with the same type argument). Why? Isn't the error message misleading and/or misplaced?

I know that this problem can be avoided replacing type-projections with facades.

    trait InnerFacade extends Product
    class Outer extends Provider[InnerFacade] {
        override def provide: Inner = new Inner
        class Inner extends InnerFacade
    }

    trait DerivedInnerFacade extends InnerFacade
    class DerivedOuter extends Outer, Provider[DerivedInnerFacade] {
        override def provide: DerivedInner = new DerivedInner
        class DerivedInner extends this.Inner, DerivedInnerFacade
    }

But that requires more verbosity, especially if the facades have to expose many methods; and I suspect that that shouldn't be necessary.

Tested with scala 3.6.2 and 3.6.3 with the same result.

本文标签: