Как сохранить Type или TypeTag в val для дальнейшего использования? - PullRequest
0 голосов
/ 28 января 2019

Я хотел бы сохранить Type или TypeTag в val для дальнейшего использования.В настоящее время мне приходится указывать тип в нескольких местах в блоке кода.Мне не нужно параметризировать код, потому что будет использоваться только один тип.Это скорее любопытство, чем необходимость.

Я пытался использовать typeOf, classOf, getClass и некоторые другие формы доступа к классу и типу.Решение, вероятно, простое, но в моих знаниях о типизации или ссылках Scala отсутствует эта концепция.

object Example extends App {

  import scala.reflect.runtime.universe._

  object TestClass { val str = "..." }
  case class TestClass() { val word = ",,," }

  def printType[A: TypeTag](): Unit = println(typeOf[A])

  printType[List[Int]]() //prints 'List[Int]'
  printType[TestClass]() //prints 'Example.TestClass'

  val typeOfCompanion: ??? = ??? //TODO what goes here?
  val typeOfCaseClass: ??? = ??? //TODO what goes here?

  printType[typeOfCompanion]() //TODO should print something like 'Example.TestClass'
  printType[typeOfCaseClass]() //TODO should print something like 'Example.TestClass'
}

Решение должно быть в состоянии сохранить Type или TypeTag или его решение.Затем передайте typeOfCompanion или typeOfCaseClass наподобие printTypetypeOfCompanion для печати.Может потребоваться изменить часть кода для печати;Я не уверен.

Ответы [ 2 ]

0 голосов
/ 28 января 2019
def printType[A: TypeTag](): Unit = println(typeOf[A])

в точности совпадает с

def printType[A]()(implicit a: TypeTag[A]): Unit = println(typeOf[A])

(кроме имени параметра).Поэтому его можно назвать

val listTypeTag /* : TypeTag[List[Int]] */ = typeTag[List[Int]]

printType()(listTypeTag)

(вы можете удалить пустой список параметров из printType, если хотите).

Для компаньона вам нужно использовать aсинглтон тип :

val companionTag = typeTag[TestClass.type]
val caseClassTag = typeTag[TestClass]
0 голосов
/ 28 января 2019

Вы должны быть более явным здесь

import scala.reflect.runtime.universe._

def printType(a: TypeTag[_]): Unit = println(a)

val typeOfCompanion = typeTag[List[Int]]

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