我在scala中使用许多表达式和运算符构建DSL,我想知道他们自己的类型。例如:
import scala.reflect.runtime.universe._
trait Expression[T] {
def evaluate: T
def evalType: scala.reflect.runtime.universe.Type // represents T
}
我希望将类型信息用于各种目的(例如,打印表达式的类型,按结果类型过滤表达式,以及将Expression [_]的集合转换为某种类型或其他类型。我可以这样做(下面),但似乎不能保持泛型类型信息AND具有类型信息可序列化的属性。
我可以让类知道它们的类型参数,如下所示:
import scala.reflect.runtime.universe._
case class TypeAware[T:TypeTag](c:Type=null) {
val typ:Type = if (c==null) typeOf[T] else c
}
class RelectionUtilTest {
@Test
def serializeTypeTest(): Unit = {
val obj = TypeAware[Seq[Int]]()
println(obj.typ) // Seq[Int]
val copy = SerializationUtil.copyBySerialization(obj) // via ObjectOutputStream -> ObjectInputStream
println(copy.typ)
}
}
...但scala的Type字段不是Serializable。
或者我可以让班级知道T
的班级[_]case class ClassAware[T:TypeTag](c:Class[_]=null) {
val clz:Class[_] = if (c==null) runtimeMirror(this.getClass.getClassLoader).runtimeClass(typeOf[T].typeSymbol.asClass) else c
}
class RelectionUtilTest {
@Test
def serializeTypeTest(): Unit = {
val obj = ClassAware[Seq[Int]]()
println(obj.typ) // Seq[_]
val copy = SerializationUtil.copyBySerialization(obj)
println(copy.typ)
}
}
但java类[_]被类型擦除: - (
那么,如何在scala中序列化泛型类型信息?
更新:序列化Java的ParameterizedType似乎是一个解决方案,但I don't see how to convert java ParameterizedType <->
scala Type。