1

プログラムで使用される特定のタイプのラッパーを作成しようとしています。また、これらすべてのタイプに、特性Ordered [T]を実装することにより、compareメソッドを持たせたいと思います。比較対象の型がOrdred[T]を暗黙的に実装していると判断するcompareメソッドの作成に問題があります。

現在の試み:

case class Value[T](someType: T) extends Ordered[T] {

  def matches(otherType: T): Boolean = {
    if(someType.getClass == otherType.getClass)
      true
    else false
  }

  override def toString() = {
    someType.toString
  }

  def compare(other: T): Int = {
    implicitly[Ordered[T]] compare other
  }
}

object Value {
  implicit def intVal(some: Int) = new Value[Int](some) {
    def compare(other: Int): Int = someType compare other
  }
  implicit def doubleVal(some: Double) = new Value[Double](some) {
    def compare(other: Double): Int = someType compare other
  }
  implicit def stringVal(some: String) = new Value[String](some) {
    def compare(other: String): Int = someType compare other
  }
  implicit def boolVal(some: Boolean) = new Value[Boolean](some) {
    def compare(other: Boolean): Int = someType compare other
  }
  implicit def dateVal(some: Date) = new Value[Date](some) {
    def compare(other: Date): Int = someType.compareTo(other)
  }
}

これは私が望む構造ですが、エラーが発生し続けます:

Could not find value for implicit parameter e: Ordered[T]

私が見逃している構文はありますか?

4

1 に答える 1

4

Orderedは型クラスではありませんが、traitクラスまたは他の特性が継承されて順序付け可能になります。したがって、のインスタンスを暗黙的に取得することはできませんOrdered。タイプパラメータを変更してshureを作成する必要があります。これは、A拡張Ordered[A]するか、1つとして表示できます(ビューバウンドであり、からへ<%の暗黙の変換が存在することを意味します)。その後、次のように呼び出すことができます。AOrdered[A]compare

case class Value[A <% Ordered[A]](value: A) extends Ordered[Value[A]] {
  def compare(other: Value[A]) = value compare other.value
}
于 2012-12-03T07:19:58.507 に答える