16

In Scala,

{ x: Option[Int] => x } .getClass .getMethod("apply", classOf[Option[_]]) .getGenericParameterTypes 

returns Array(scala.Option<java.lang.Object>). I'd initially been expecting to see instead Array(scala.Option<scala.Int>), but I see that scala.Int is a value class (extends AnyVal) 'whose instances are not represented as objects by the underlying host system'.

I still don't understand the erasure to Object, though. Couldn't it be the much more useful java.lang.Integer?

3
  • 1
    That isn't Scala doing that -- it's Java. To get useful, as in non-Object, results from "GenericParameterTypes" (a method of a Java Class object), a Subclass has to be created. Scala didn't create a Subclass, say OptionInt, for Option[Int]. (See @specialized, perhaps?) Commented Jun 23, 2012 at 6:34
  • 2
    @pst; I think you're on the wrong track. Change Int to Symbol above and you get Array(scala.Option<scala.Symbol>). Commented Jun 23, 2012 at 7:03
  • Hmm, well there goes my hypothesis :-/ I blame compiler magic. Commented Jun 23, 2012 at 7:36

1 Answer 1

12

Couldn't it be the much more useful java.lang.Integer?

Yes, and that was even the case, once. Unfortunately, that leads to broken type signatures. That is, it is impossible to generate correct bytecode in all situations if Int is erased to java.lang.Integer.

There isn't a single ticket or commit about this, but the one that changed this particular behavior is scala/bug#4214, in this commit.

Sign up to request clarification or add additional context in comments.

2 Comments

Thanks. I had a look at git log --grep=Integer but didn't see anything obvious.
@ScottMorrison You should have searched for "signature". Anyway, I found it for you. See revised answer.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.