2012-06-23 57 views
14

En Scala,¿Por qué los tipos primitivos como Int se borran a Object en Scala?

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

vuelve Array(scala.Option<java.lang.Object>). Inicialmente esperaba ver Array(scala.Option<scala.Int>), pero veo que scala.Int es una clase de valor (extiende AnyVal) 'cuyas instancias no están representadas como objetos por el sistema host subyacente'.

Todavía no entiendo la eliminación a Object, sin embargo. ¿No podría ser el mucho más útil java.lang.Integer?

+1

Eso no es Scala haciendo eso, es Java. Para obtener resultados útiles, como en los que no son Object, de "GenericParameterTypes" (un método de un objeto de la clase Java), se debe crear una subclase. Scala * no * creó una Subclase, digamos 'OptionInt', para' Opción [Int] '. (Consulte @especializado, ¿quizás?) –

+2

@pst; Creo que estás en el camino equivocado. Cambia 'Int' a' Symbol' arriba y obtienes 'Array (scala.Option )'. –

+0

Hmm, bueno ahí va mi hipótesis: - Culpo a la magia del compilador. –

Respuesta

6

¿No podría ser el mucho más útil java.lang.Integer?

Sí, y eso fue incluso el caso, una vez. Desafortunadamente, eso conduce a firmas de tipos rotas. Es decir, es imposible generar código de byte correcto en todas las situaciones si Int se borra a java.lang.Integer.

No hay un solo ticket ni compromiso sobre esto, pero el que cambió este comportamiento en particular es SI-4214, en this commit.

+0

Gracias. Eché un vistazo a 'git log --grep = Integer' pero no vi nada obvio. –

+0

@ScottMorrison Deberías haber buscado "firma". De todos modos, lo encontré para ti. Ver respuesta revisada. –

Cuestiones relacionadas