在 Scala 中,反射模块是否不适合处理运行时,可能被擦除的类型?



考虑一个简单的用例,在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不携带额外的信息

类型和类是不同的概念。也许你的意思是ClassTags。

使用或不使用 F 边界多态性是您的选择。

最新更新