繁体   English   中英

Scala:特征的抽象比较方法

[英]Scala: abstract comparison method in trait

我有一个特征,它具有要在sublcass中实现的大小比较功能:

trait A {
    def isLessThan(that: A): Boolean
    ...
}
class SubOfA() extends A {
    ...
    override def isLessThan(that: SubOfA): Boolean = {
        this.size < that.size
    }
    ...
}

但是,该方法不是有效的替代,因为参数类型是SubOfA而不是A


我也尝试过使参数类型为this.type ,但是当我从抽象设置中调用方法时,我不能使用A类型的对象作为参数:

...
(foo: A, bar: A) => foo.isLessThan(bar)

这将期望类型foo.type而不是A ,它们是相同的,但是我认为编译器还不知道。


关于如何使这种工作有效的任何想法? 我到处都在寻找答案,但是什么也找不到。 也许我不知道问什么是正确的问题。

您可以使用F-Bounded 多态性 (这是Java上的解决方案) ,也可以使用Typeclasses 多态性 (这是Haskell上的解决方案)
我个人比较喜欢使用类型类,因为它具有更好的可扩展性,可维护性和类型安全性-Rob Norris 在此进行了更为客观的比较。

F界。

trait Comparable[A <: Comparable[A]] { this: A =>
  def isLessThan(that: A): Boolean
}

class SubOfComparable extends Comparable[SubOfComparable] {
  val size: Int = ???
  override final def isLessThan(that: SubOfComparable): Boolean =
    this.size < that.size
}

类型类。

trait Comparator[T] {
  def isLessThan(a: T, b: T): Boolean
}

object syntax {
  object comparator {
    implicit final class ComparatorOps[T](val self: T) extends AnyVal {
      final def < (that: T)(implicit C: Comparator[T]): Boolean =
        C.isLessThan(self, that)
    }
  }
}

class Sub {
  final val size: Int = ???
}

object Sub {
  implicit val SubComparator: Comparator[Sub] = new Comparator[Sub] {
    override final def isLessThan(a: Sub, b: Sub): Boolean =
      a.size < b.size
  }
}

import syntax.comparator._
val a = new Sub(...)
val b = new Sub(...)
a < b

您可以使用以下方法解决第一种方法:

class SubOfA() extends A {

    override def isLessThan(that: A): Boolean = that match {
        case that : subOfA =>  this.size < that.size
        case _ => throw new UnsupportedOperationException("Wrong comparison") //or whatever behaviour deemed suitabe here
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM