【问题标题】:NullPointerException on Scala reflection with typeOf[T]使用 typeOf[T] 进行 Scala 反射的 NullPointerException
【发布时间】:2020-02-13 05:01:14
【问题描述】:

我正在尝试在 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 行。

【问题讨论】:

    标签: scala generics reflection


    【解决方案1】:

    为什么会有这条线?

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

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

    private val ovalType = getTypeString
    

    如果没有类型参数,它可能会推断出getTypeString[Nothing]。这就是你想要的吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 2012-06-19
      • 1970-01-01
      • 2023-03-08
      • 2023-03-06
      相关资源
      最近更新 更多