Why don't Scala primitives show up as type parameters in Java reflection?

Viewed 1021

Given the following case class:

case class Foo(
    bar: Int,
    baz: Boolean,
    qux: Option[Int],
    quux: Option[Boolean],
    quuux: Option[Integer]
)

I would expect the following:

for (f <- classOf[Foo].getDeclaredFields) {
    println(f.getGenericType)
}

to produce something like:

int
boolean
scala.Option<int>
scala.Option<boolean>
scala.Option<java.lang.Integer>

But instead, it produces:

int
boolean
scala.Option<java.lang.Object>
scala.Option<java.lang.Object>
scala.Option<java.lang.Integer>

Why do the primitives get erased from the generics, instead of getting treated as java.lang.Integer.TYPE and java.lang.Boolean.TYPE, as appears to happen with the plain fields?

And is there any way to retrieve the primitive type parameters from classOf[Foo]?

1 Answers
Related