我有一个 DSL 和一些运行时代码。问题是我在运行时到达某个地方:
val clazz: Class[_ <: java.io.Serializable] = classOf[java.lang.String]
val value: java.io.Serializable = "abc"
我有一堂课
class MyWrapper[T <: java.io.Serializable](val data: T)(implicit m: Manifest[T]) {
override def toString = m.runtimeClass
}
val wrapper = new MyWrapper(value)
问题是我需要java.lang.String
从toString
. 但我得到了java.io.Serializable
。不幸的是,我既不能为每个java.io.Serializable
子类型创建固定的模式匹配(这太疯狂了),也不MyWrapper
能用new MyWrapper[String](value)
. 我不知道 的类型value
,也许它是 的子类型Serializable
。
如果我知道值类型等于变量,是否有某种方法可以在运行时传递类型/清单值clazz
?
更新(Régis Jean-Gilles 的解决方案不起作用)。REPL测试:
val clazz: Class[_ <: java.io.Serializable] = classOf[java.lang.String]
val value: java.io.Serializable = "abc"
class MyWrapper[T <: java.io.Serializable](val data: T)(implicit m: Manifest[T]) {
override def toString = m.runtimeClass.getName
}
val wrapper = new MyWrapper(value)
//val wrapper = new MyWrapper(value)(ClassManifest.fromClass(clazz).asInstanceOf[ClassTypeManifest[java.io.Serializable]])
//val wrapper = new MyWrapper(value)(ClassManifest.fromClass(clazz))
System.err.println(wrapper.toString)
如果我尝试显式传递清单,则会出现错误:
scala> :load test.scala
Loading test.scala...
clazz: Class[_ <: java.io.Serializable] = class java.lang.String
value: java.io.Serializable = abc
defined class MyWrapper
<console>:10: error: type mismatch;
found : scala.reflect.ClassManifest[_$1] where type _$1 <: java.io.Serializable
(which expands to) scala.reflect.ClassTag[_$1]
required: Manifest[java.io.Serializable]
val wrapper = new MyWrapper(value)(ClassManifest.fromClass(clazz))
^
<console>:8: error: not found: value wrapper
System.err.println(wrapper.toString)
我也无法明确表达清单。
当我尝试编译我的应用程序时出现更奇怪的错误 -
[error] found : scala.reflect.ClassManifest[(some other)_0(in method setProperty)]
[error] (which expands to) scala.reflect.ClassTag[(some other)_0(in method setProperty)]
[error] required: Manifest[_0(in method setProperty)]
[error] new Value.Static(default, Context.virtual(element))(ClassManifest.fromClass(elementProperty.typeClass)))
恕我直言,Régis Jean-Gilles 非常接近解决方案。如何使其与 Scala 2.10 一起使用?