Вопрос по type-erasure, scala, autoboxing – Почему примитивные типы, такие как Int, стираются в Object в Scala?

14

В Скале

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

возвращаетсяArray(scala.Option<java.lang.Object>), Я изначально ожидал увидеть вместо этогоArray(scala.Option<scala.Int>)но я вижу чтоscala.Int это класс значений (расширяетAnyVal) "чьи экземпляры не представлены в качестве объектов базовой хост-системой".

Я до сих пор не понимаю стираниеObject, хоть. Не может ли это быть гораздо более полезнымjava.lang.Integer?

Хм, ну вот и моя гипотеза: - Я обвиняю магию компилятора. user166390
@Тихоокеанское стандартное время; Я думаю, что вы на неправильном пути. + ИзменитьInt вSymbol выше, и вы получитеArray(scala.Option<scala.Symbol>). Scott Morrison
Это не Scala делает это - это Java. Чтобы получить полезные результаты, как в «Необъекте», получены результаты из & quot; GenericParameterTypes & quot; (метод объекта класса Java), должен быть создан подкласс. Scaladidn't создать подкласс, скажемOptionInt, заOption[Int], (См. @Specialized, возможно?) user166390

Ваш Ответ

1   ответ
6

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

Да, и так было даже когда-то. К сожалению, это приводит к неправильным сигнатурам. То есть,it is impossible to generate correct bytecode in all situations if Int is erased to java.lang.Integer.

Нет ни одного билета или коммита об этом, но тот, который изменил это конкретное поведение,SI-4214, вэтот коммит.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededgit log --grep=IntegerError: User Rate Limit Exceeded Scott Morrison

Похожие вопросы