5

オブジェクトがケース クラスのインスタンスであるかどうかを知る方法があるかどうか疑問に思っていました。構造型の一致を見つけようとしていましたがunapply、継承していることに気付きましたProduct。次のような関数が本当に必要です。

def withCaseClass[T <: /* matcher for case class */](obj:T) ...

私の主な関心は、ケース クラスのみがこの関数に渡されるようにすることです。

4

4 に答える 4

7

Acase classは実装の詳細です。ケースクラスとまったく同じように動作するクラスを作成できます。これができることは非常に重要です。これにより、特定の要件により通常のクラスを選択した方がよい場合に、通常のクラスに確実に切り替えることができるからです。

于 2011-01-15T04:42:13.600 に答える
2

ケースクラスに対してコンパイラが行うこととまったく同じことを「手動で」行うことができ、生成されたバイトコードは区別できないため(これは単語ですか?おかしく見えます...)、運が悪いです。本当の問題は、なぜ気にする必要があるのか​​ということです。

于 2011-01-15T11:56:35.213 に答える
2

ケースクラスまたはタプルのどちらにもマーカー特性はありません。そのため、Product を拡張し、"scala.*" で始まるパッケージに含まれていないことを確認することをお勧めします。:/

于 2011-01-15T01:36:56.603 に答える
0

Javaで私が使用した

Product.class.isAssignableFrom(someClassThatMayBeACaseClass);

何かがケースクラスであるかどうかを検出します。ただし、ケース クラスではない製品が存在する可能性があります。

于 2012-10-29T14:22:10.730 に答える