14

何かが であるかどうかをパターンマッチで検出することは可能Numericですか? 私は次のことをしたい:

class DoubleWrapper(value: Double) {
  override def equals(o: Any): Boolean = o match {
    case o: Numeric => value == o.toDouble
    case _ => false
  }
  override def hashCode(): Int = value ##
}

しかしもちろん、 はandNumericのようなもののスーパータイプではなく、型クラスであるため、これは実際には機能しません。の契約に合わせなければならないので、私もできません。IntDoubledef equals[N: Numeric](o: N)oAnyequals

Numericでは、既知のすべてのクラス (私が知らないかもしれないユーザー定義のクラスを含むと思います)をリストアップせずに、どうすればよいでしょうか?

4

2 に答える 2

5

元の問題は解決できません。理由は次のとおりです。

型が型クラス (Numeric など) のインスタンスであるかどうかを調べるには、暗黙的な解決が必要です。暗黙的な解決はコンパイル時に行われますが、実行時に行う必要があります。私が知る限り、Scala コンパイラーは必要なすべての情報をコンパイル済みのクラス ファイルに残していないため、これは現在不可能です。これを確認するには、暗黙の修飾子を持つローカル変数を含むメソッドを使用してテスト クラスを記述します。修飾子が削除されても、コンパイル出力は変更されません。

于 2012-08-19T07:34:50.903 に答える
0

DoubleWrapperにメソッドを追加するために使用していDoubleますか? 次に、それは透過型である必要があります。つまり、インスタンスを保持するのではなく、Double代わりに返される pimped メソッドを定義する必要があります。そうすれば、プリミティブに対して定義されているとおりに使用し続けることができます==。これは、すでに必要なことを行っています(6.0 == 6yields true)。


わかりました、そうでない場合はどうですか

override def equals(o: Any): Boolean = o == value

それに応じて他のラッパーのメソッドを作成equalsすると、プリミティブ値を再度比較することになります。

もう 1 つの問題は、ステートフル ラッパーにそのようなメソッドを用意する必要があるかどうかです。equals変更可能なオブジェクトは、それらが保持する値の 1 つに応じて等しいとは思いません。これで問題が発生する可能性が最も高いでしょう。

于 2012-08-18T19:57:03.257 に答える