考虑一个简单的用例,在Java反射中提取对象的字段:
val fields = this.getClass.getDeclaredFields
如果使用泛型类型,它可能会返回不完整的信息,但它简短、快速并且可以处理大多数情况。
在 Scala 反射模块 (scala.reflect
( 中,似乎不存在这样的单行代码,我所知道的可以成功处理这种情况的最短代码是:
trait Thing[T <: Thing[T]{
implicit ev: TypeTag[T]
scala.reflect.runtime.universe.typeOf[T].members
}
这使用冗余的 F 边界多态性,并且与 Java 类相比,TypeTag 不携带额外的信息,有没有办法让它更短,至少和 Java(这是一种非常冗长的语言(一样短?
非常感谢您的建议
我不确定在这种特定情况下
this.getClass.getDeclaredFields
比
def fields[T: TypeTag](t: T) = typeOf[T].decls
fields(this)
无论如何,你仍然可以在Scala中使用Java反射。
有时 Scala 反射比 Java 反射更冗长,但 Scala 反射允许做 Java 反射无法完成的事情(用 Scala 术语来说((例如,如果 Java 中没有相应的 Scala 概念(。
这不是真的
与Java类相比,TypeTag不携带额外的信息
类型和类是不同的概念。也许你的意思是ClassTag
s。
使用或不使用 F 边界多态性是您的选择。