首页 > 解决方案 > 使用 typeOf[T] 进行 Scala 反射的 NullPointerException

问题描述

我正在尝试处理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)

空指针在线发生private val ovalType = getTypeString

标签: scalagenericsreflection

解决方案


你为什么有这条线?

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

目前尚不清楚T此范围内有什么,但结果将tagnull因为typeTag[T]看到有一个隐式tag: TypeTag[T]可用并返回它。除非它还没有初始化,所以它会看到null. 然后,如果typeOf[T]与 same 一起使用T,它将null作为其隐式参数得到,从而导致您看到的异常。

private val ovalType = getTypeString

如果没有类型参数,它可能会推断getTypeString[Nothing]. 那是你要的吗?


推荐阅读