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.
本文标签:
版权声明:本文标题:inheritance - Scala Compiler Error: Type Not Found in Derived Class When Extending Trait with Inner Class Type Projection - Stac 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1741793949a2397823.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论