1

クラスの 2 つのインスタンスを比較する演算子を持つ抽象クラスを定義しようとしています。ただし、クラスを具体化するときは、メソッドで同じ型のインスタンスのみを比較する必要があります。このようなもの

abstract class ComparableSuper{
  def <(other: ComparableSuper): Boolean  
  def <=(other: ComparableSuper): Boolean  
  def >(other: ComparableSuper): Boolean
  def >=(other: ComparableSuper): Boolean
}


class Comparable (val a: Int) extends ComparableSuper {
   def <(other: Comparable): Boolean = this.a < other.a
   def >(other: Comparable): Boolean = this.a > other.a
   def <=(other: Comparable): Boolean = this.a <= other.a
   def >=(other: Comparable): Boolean = this.a >= other.a
}

もちろん、抽象クラスのメソッドをオーバーライドしていないため、このコードはコンパイルされません。ただし、メソッドで Comparable を ComparableSuper に変更すると、フィールド a がそこにあるという保証はありません。

メソッド署名でクラスの型を指定する方法はありますか?

前もって感謝します。

4

2 に答える 2

3

Ordering type classをご覧になることを強くお勧めします。

この問題に対する型クラスのアプローチは、それを行う方法よりもはるかに優れていることがわかりましComaprableた(比較したいオブジェクトが実際に拡張されている場合Comparable)。

型クラスのアプローチを使用すると、型の安全性と柔軟性も向上します。実際にはOrdering、既存のクラス (制御および変更できないクラス) のインスタンスを定義できます。


Ordering使用するのは少し不器用かもしれOrderedませんが、次のようなコードを書くことを可能にする暗黙的なものがあります:

import math.Ordered._

def isGreater[T : Ordering](a: T, b: T) = a > b

そのため、利便性を損なうことさえありません。(ちなみにOrderedJavaの と同等ですComparable)

于 2012-06-14T20:10:40.090 に答える
2

この場合、math.Orderedormath.Orderingを使用することをお勧めしますが、このパターンが必要な場合は、F -bounded polymorphismを使用できます。

trait Foo[A <: Foo[A]] {
  def f(that: A): Int
}

class Bar(val x: Int) extends Foo[Bar] {
  def f(that: Bar) = this.x - that.x
}

スーパータイプのパラメーター化には多少の構文オーバーヘッドが伴いますが、同じサブクラスのインスタンスを必要とするメソッドを持つことができます。

于 2012-06-14T22:03:55.697 に答える