inheritance - Scala Compiler Error: Type Not Found in Derived Class When Extending Trait with Inner Class Type Projection - Stac

admin2025-04-16  5

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.

转载请注明原文地址:http://www.anycun.com/QandA/1744746437a87026.html