scala - Scala 中的可交换特性

标签 scala inheritance traits

我想定义一个 Swappable具有两个值的特征 x,y和一个 swap调用 swap 的方法在继承自 Swappable 的对象上返回与 x,y 相同类型的另一个对象切换。到目前为止我最好的是:

trait Swappable[T] {
  val x: T
  val y: T
  def swap: Swappable[T] = {
    val (a,b) = (x,y)
    new Swappable[T] { val x=b; val y=a }
  }
}

但这不是我想要的,因为交换的返回类型是某个匿名类,而不是我开始使用的原始类,所以我收到如下错误:
def direct[S<:Swappable[Int]](s: S): S = if (s.x > s.y) s else s.swap 
<console>:32: error: type mismatch;
 found   : Swappable[Int]
 required: S
       def direct[S<:Swappable[Int]](s: S): S = if (s.x > s.y) s else s.swap
                                                                        ^

有可能做我想做的事吗?交换的正确类型签名是什么?

最佳答案

我不知道该怎么做,但我认为这可能有助于更好地了解您想要发生的事情。考虑一个类

case class Foo(x: Int, y: Int) extends Swappable[Int] {
    val z = x
}

现在,如果您有 f = Foo(1, 2) , 应该 f.swap给你一个Foo哪里x != z ?如果是这样,Scala 就无法创建 Foo像那样。如果不是,那么“交换 x 和 y”到底是什么意思?

也许你真正要找的是这样的:
trait Swappable[A,T] {
    this: A =>

    val x: T
    val y: T
    def cons(x: T, y: T): A

    def swap = cons(y, x)
}

case class Foo(x: Int, y: Int) extends Swappable[Foo,Int] {
    val z = x

    def cons(x: Int, y: Int) = copy(x=x, y=y)
}

但我不确定。

关于scala - Scala 中的可交换特性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8842840/

相关文章:

function - 具有虚函数的类中的非虚函数

c++ - 限制对 C++ 中特定类的方法访问

scala - Scala 中 trait 中使用的抽象值有什么问题吗?

list - 更快的置换生成器

java - 如何在 Java 中实现 Scala apply 方法

scala - 如何使用 scala 内部构件比 fsc 更快地编译源代码(快速 scala 编译器)

java - 多态参数适用于父类(super class),但不适用于子类

generics - 指定泛型参数属于一小组类型

对于给定的 impl,rustc 可以是 "infer the appropriate lifetime",但不能用于另一个

scala - 如何使用 sbtosgi 生成 osgi 包作为 sbt 发布任务的一部分