Получить имя типа Scala для распространенных типов / примитивов AnyVal - PullRequest
1 голос
/ 20 апреля 2019

В моем коде scala у меня есть экземпляр Class[_ <: AnyVal], например, полученный из classOf[Int].

Когда я пытаюсь получить имя типа scala от этого (используя classOf[Int].getName), я ожидаю увидеть "scala.Int", но вместо этого я получаю имя примитивного типа Java: "int"

Как я могу получить имя типа scala из моей переменной Class, если я имею дело с эквивалентным примитивом java или эквивалентным по умолчанию java-эквивалентом (таким как java.lang.Integer)


На случай, если вам интересно, зачем мне это нужно; Я генерирую некоторый scala-код, используя treehugger, и информацию о том, нужно ли мне генерировать, например, scala.Int исходит из библиотеки, которая предоставляет Class[_]

1 Ответ

1 голос
/ 21 апреля 2019

Если вы хотите обрабатывать только примитивные типы,

def scalaName(cls: Class[_]) = 
  if (cls.isPrimitive) s"scala.${cls.getName.capitalize}" else cls.getName

К сожалению, стандартная библиотека Java не (пока, насколько мне известно) не обеспечивает способ преобразования между коробочными и примитивными Class es, поэтому лучший способ - обрабатывать их все по отдельности:

val classesMap = Map[Class[_], Class[_]](
  classOf[java.lang.Integer] -> classOf[Int], 
  classOf[java.lang.Short] -> classOf[Short], 
  ...
)

def scalaName1(cls: Class[_]) = scalaName(classesMap.getOrElse(cls, cls))

Вы также можете обрабатывать Void.TYPE специально (например, преобразование в scala.Unit).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...