gpt4 book ai didi

scala - 为 Scala 特征中的方法指定具体类型

转载 作者:行者123 更新时间:2023-12-02 16:15:29 24 4
gpt4 key购买 nike

我想在 Scala trait 中定义一个方法,其中方法的参数和返回类型都对应于扩展该 trait 的同一个具体类。我试过类似下面的东西:

trait A {
def foo(obj: this.type): this.type
}

final case class B(val bar: Int) extends A {
override def foo(obj: B): B = {
B(obj.bar + this.bar)
}
}

object Main {
def main(args: Array[String]) = {
val b1 = new B(0)
val b2 = new B(0)
val b3: B = b1.foo(b2)
}
}

但是,尝试编译此代码会出现以下错误:

Test.scala:5: error: class B needs to be abstract. Missing implementation for:
def foo(obj: B.this.type): B.this.type // inherited from trait A
case class B(val bar: Int) extends A {
^
Test.scala:6: error: method foo overrides nothing.
Note: the super classes of class B contain the following, non final members named foo:
def foo: ((obj: _1.type): _1.type) forSome { val _1: B }
override def foo(obj: B): B = {
^
2 errors

很明显,我对 Scala 类型系统有一些误解。 B 类中foo 的签名是我想要的,但我不知道如何正确定义A 中的方法(或者如果这甚至可能的话)。好像this question问的问题非常相似,但我没有立即看出答案如何适用于我的情况。

最佳答案

类型注解this.type意味着你只能返回 this .因此,在那种情况下,您可能不会返回 B 的另一个实例。 ,同样适用于方法参数。

如果这只是关于返回类型,一个解决方案是要求 foo返回 A 类型的东西, B 中的覆盖方法可以特化返回类型返回B .

但是,由于您还有一个参数希望成为子类型的类型,因此您可以使用 Self Recursive Type .下面的例子编译并且应该做你想做的事。

  trait A[S <: A[S]] {
def foo(obj: S): S
}

case class B(val bar: Int) extends A[B] {
override def foo(obj: B): B = {
B(obj.bar + 1)
}
}

关于scala - 为 Scala 特征中的方法指定具体类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66856090/

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