scala – define方法返回类的扩展
发布时间:2020-12-16 09:32:09 所属栏目:安全 来源:网络整理
导读:我想要做这样的事情: trait A { def f(): ???_THE_EXTENDING CLASS}class C extends A { def f() = self}class D extends A { def f() = new D}class Z extends D { def f() = new Z} 以下代码将不会编译 class Bad1 extends A { def f() = "unrelated stri
我想要做这样的事情:
trait A { def f(): ???_THE_EXTENDING CLASS } class C extends A { def f() = self } class D extends A { def f() = new D } class Z extends D { def f() = new Z } 以下代码将不会编译 class Bad1 extends A { def f() = "unrelated string" } class Bad2 extends A { def f() = new C // this means that you can't just define a type parameter on // A like A[T <: A] with f() defined as f: T } class Bad3 extends D // f() now doesn't return the correct type 这种关系有名吗?在Scala中如何注释/实现? 编辑 以下作品,您可以看到: scala> trait A { | def f: this.type | } defined trait A scala> class C extends A { | def f = this | } defined class C scala> class D extends A { | def f = new D | } <console>:7: error: type mismatch; found : D required: D.this.type def f = new D ^ 有没有办法绕开呢? 编辑2 使用第二个系统,我可以这样做,这是很好的D类的定义: scala> trait A[T <: A[T]] { def f(): T } defined trait A // OR scala> trait A[T <: A[T]] { self: T => | def f(): T | } scala> class C extends A[C] { def f() = new C } defined class C scala> class D extends C defined class D scala> (new D).f res0: C = C@465fadce 解决方法
恐怕没有可能知道扩展类的扩展类是什么。
最接近你想要的是类似于好奇的循环模板模式(CRTP),从C知道。 trait A[T <: A[T]] { def f(): T; } class C extends A[C] { def f() = new C } class D extends A[D] { def f() = new D } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容