Dav*_*les 10 generics reflection scala
给出以下案例类:
case class Foo(
bar: Int,
baz: Boolean,
qux: Option[Int],
quux: Option[Boolean],
quuux: Option[Integer]
)
Run Code Online (Sandbox Code Playgroud)
我希望如下:
for (f <- classOf[Foo].getDeclaredFields) {
println(f.getGenericType)
}
Run Code Online (Sandbox Code Playgroud)
产生类似的东西:
int
boolean
scala.Option<int>
scala.Option<boolean>
scala.Option<java.lang.Integer>
Run Code Online (Sandbox Code Playgroud)
但相反,它产生:
int
boolean
scala.Option<java.lang.Object>
scala.Option<java.lang.Object>
scala.Option<java.lang.Integer>
Run Code Online (Sandbox Code Playgroud)
为什么原语会从泛型中删除,而不是像普通字段那样被视为java.lang.Integer.TYPE和java.lang.Boolean.TYPE?
有没有办法从中检索原始类型参数classOf[Foo]?
Scala认为基元的通用参数是scala.<Primitive>例如scala.Int.它不会将类型存储在Java类文件中,尽管可以说它可以.(或者不是;取决于是否需要区分Int和java.lang.Integer;在封装形式下java.lang.Integer,即使编译器做得很好,让你相信它Int.)
无论如何,Scala有自己的反射功能,但是在2.10你可以找到Option类型的参数,如下所示:
import scala.reflect.runtime.universe._
typeTag[Foo].tpe.members.collect{
case m: MethodSymbol if m.isCaseAccessor => m
}.foreach(m => println(m.name + " " + m.typeSignature))
Run Code Online (Sandbox Code Playgroud)
你会得到类似的东西
quuux => scala.Option[java.lang.Integer]
quux => scala.Option[scala.Boolean]
qux => scala.Option[scala.Int]
baz => scala.Boolean
bar => scala.Int
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
934 次 |
| 最近记录: |