何が起こっているのかよくわからないので、この質問の言い方がよくわかりません。しかし、マニフェストがインスタンスの実際の実行時の型を教えてくれると期待するところでは、それが割り当てられている変数の実行時の型を教えてくれているようです。
// scala 2.10.1
trait Base
class Impl1 extends Base
class Impl2 extends Base
def showManifest[T <: Base](thing: T)(implicit ev: Manifest[T]) = println(thing + ": " + ev.runtimeClass)
val (impl1, impl2) = (new Impl1, new Impl2)
println("=== impl1 and impl2 ===")
showManifest(impl1)
showManifest(impl2)
val choose1 = if(true) impl1 else impl2
val choose2 = if(false) impl1 else impl2
println("=== choose1 and choose2 ===")
showManifest(choose1)
showManifest(choose2)
出力:
=== impl1 and impl2 ===
Main$$anon$1$Impl1@48ff2413: class Main$$anon$1$Impl1
Main$$anon$1$Impl2@669980d5: class Main$$anon$1$Impl2
=== choose1 and choose2 ===
Main$$anon$1$Impl1@48ff2413: interface Main$$anon$1$Base
Main$$anon$1$Impl2@669980d5: interface Main$$anon$1$Base
では、choose1 と choose2 の型は Base ですが、メソッドが Manifest[Base] になるのはなぜですか? これを回避する方法はありますか? コンパイル時にわからない型 (構成パラメーターなどで選択) を選択し、それをファクトリ メソッドに渡すことができますか?