我不太确定如何表达这个问题,因为我真的不明白发生了什么。但是我希望清单能够告诉我实例的实际运行时类型,它似乎告诉我分配给它的变量的运行时类型。
// 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] 结尾的原因吗?有没有办法解决这个问题,以便我可以在编译时选择我不知道的类型(通过配置参数等选择)并将其传递给工厂方法?