次のシグネチャを持つ関数があります。
myFunc[T <: AnyRef](arg: T)(implicit m: Manifest[T]) = ???
コンパイル時に引数の正確な型がわからない場合、どうすればこの関数を呼び出すことができますか?
例えば:
val obj: AnyRef = new Foo() // At compile time obj is defined as AnyRef,
val objClass = obj.getClass // At runtime I can figure out that it is actually Foo
// Now I would need to call `myFunc[Foo](obj.asInstanceOf[Foo])`,
// but how would I do it without putting [Foo] in the square braces?
論理的に次のようなものを書きたいと思います。
myFunc[objClass](obj.asInstanceOf[objClass])
ありがとうございました!
アップデート:
質問は無効です-@DaoWen、@Jelmo、および@itsbruceが正しく指摘したように、私がやろうとしていたことは完全にナンセンスでした! 私はその問題を真剣に考えすぎました。君たちありがとう!残念ながら、すべての答えを正しいものとして受け入れることはできません:)
したがって、問題は次の状況によって引き起こされました。
Salatライブラリを使用して、オブジェクトを BSON/JSON 表現との間でシリアル化しています。
シリアライゼーションとデシリアライゼーションの両方に使用されるクラスがありますSalat
。BSON からの逆シリアルGrater[T]
化のメソッド呼び出しは次のようになります。
val foo = grater[Foo].asObject(bson)
ここで、型パラメーターの役割は明らかです。私がやろうとしていたのは、同じ Grater を使用して、ドメイン モデルからエンティティをシリアル化することです。だから私は書いた:
val json = grater[???].toCompactJSON(obj)
私はすぐに考えを巡らせましたが、明らかな解決策が表面にあるとは思いませんでした。それは次のとおりです。
grater[Entity].toCompactJSON(obj) // where Entity...
@Salat trait Entity // is a root of the domain model hierarchy
物事は私たちが思っているよりもはるかに簡単な場合があります! :)