gpt4 book ai didi

scala - 定义方法以返回扩展它的类的类型

转载 作者:行者123 更新时间:2023-12-03 11:41:36 25 4
gpt4 key购买 nike

我希望能够做这样的事情:

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

最佳答案

恐怕没有可能从扩展类中知道什么是扩展类。

最接近您想要的东西是类似于 C++ 中众所周知的 Curiously Recurring Template Pattern (CRTP) 的东西。

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
}

关于scala - 定义方法以返回扩展它的类的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5331722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com