NullPointerException при Scala отражении с typeOf [T] - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь обработать что-то из заданного типа в Scala обобщениях, как это:

import scala.reflect.runtime.universe._

implicit private val tag: TypeTag[T] = typeTag[T]
private def getTypeString(implicit tag: TypeTag[T]): String = typeOf[T] match {
  case t if t =:= typeOf[OvalTest] => "tests"
  case t if t =:= typeOf[OvalObject]=> "objects"
  case t if t =:= typeOf[OvalState]=> "states"
  case t if t =:= typeOf[OvalVariable] => "variables"
}

Я получаю исключение:

Exception in thread "main" java.lang.NullPointerException
    at scala.reflect.api.TypeTags.typeOf(TypeTags.scala:357)
    at scala.reflect.api.TypeTags.typeOf$(TypeTags.scala:357)
    at scala.reflect.api.Universe.typeOf(Universe.scala:73)
    at composer.OvalIndexer$ElementsIndexer.getTypeString(OvalIndexer.scala:142)
    at composer.OvalIndexer$ElementsIndexer.<init>(OvalIndexer.scala:148)
    at composer.OvalIndexer$.createIndex(OvalIndexer.scala:48)
    at Main$.main(Main.scala:11)
    at Main.main(Main.scala)

В строке * 1007 происходит нулевой указатель private val ovalType = getTypeString.

Ответы [ 2 ]

3 голосов
/ 13 февраля 2020

Почему у вас есть эта строка?

implicit private val tag: TypeTag[T] = typeTag[T]

Не ясно, что T находится в этой области, но в результате tag будет null, потому что typeTag[T] видит доступное неявное tag: TypeTag[T] и возвращает его. За исключением того, что он еще не инициализирован, поэтому он увидит null. Затем, если typeOf[T] используется с тем же T, он получит null в качестве неявного аргумента, что приведет к исключению, которое вы видите.

private val ovalType = getTypeString

Без параметра типа это, вероятно, выведет getTypeString[Nothing]. Это то, что вы хотите?

0 голосов
/ 13 февраля 2020

Scala уже имеет конструкции, соответствующие типу. В вашем случае это может выглядеть следующим образом:

private def getTypeString(implicit tag: TypeTag[T]): String = tag match {
  case ot: TypeTag[OvalTest] => "tests"
  case oo: TypeTag[OvalObject] => "objects"
  case os: TypeTag[OvalState] => "states"
  case ov: TypeTag[OvalVariable] => "variables"
  case _ => "unknown"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...