オブジェクトがケース クラスのインスタンスであるかどうかを知る方法があるかどうか疑問に思っていました。構造型の一致を見つけようとしていましたがunapply
、継承していることに気付きましたProduct
。次のような関数が本当に必要です。
def withCaseClass[T <: /* matcher for case class */](obj:T) ...
私の主な関心は、ケース クラスのみがこの関数に渡されるようにすることです。
Acase class
は実装の詳細です。ケースクラスとまったく同じように動作するクラスを作成できます。これができることは非常に重要です。これにより、特定の要件により通常のクラスを選択した方がよい場合に、通常のクラスに確実に切り替えることができるからです。
ケースクラスに対してコンパイラが行うこととまったく同じことを「手動で」行うことができ、生成されたバイトコードは区別できないため(これは単語ですか?おかしく見えます...)、運が悪いです。本当の問題は、なぜ気にする必要があるのかということです。
ケースクラスまたはタプルのどちらにもマーカー特性はありません。そのため、Product を拡張し、"scala.*" で始まるパッケージに含まれていないことを確認することをお勧めします。:/
Javaで私が使用した
Product.class.isAssignableFrom(someClassThatMayBeACaseClass);
何かがケースクラスであるかどうかを検出します。ただし、ケース クラスではない製品が存在する可能性があります。