scala - 使用 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
。
解决方案
你为什么有这条线?
implicit private val tag: TypeTag[T] = typeTag[T]
目前尚不清楚T
此范围内有什么,但结果将tag
是null
因为typeTag[T]
看到有一个隐式tag: TypeTag[T]
可用并返回它。除非它还没有初始化,所以它会看到null
. 然后,如果typeOf[T]
与 same 一起使用T
,它将null
作为其隐式参数得到,从而导致您看到的异常。
private val ovalType = getTypeString
如果没有类型参数,它可能会推断getTypeString[Nothing]
. 那是你要的吗?
推荐阅读
- javascript - 如何在Javascript es6中过滤对象数组
- google-apps-script - 如何使用它们的索引选择两列 - GetRangeList
- python - 如何在 y 轴上绘制高斯分布?
- javascript - 一个在相等数量的真或假值之间进行排序的函数
- python - 使用python在y轴上绘制三个不同的列
- hubspot - 在 hubspot 中添加过滤器
- sql - 在 Snowflake 中使用 SQL 获取 JSON 数组的索引
- mysql - 如何将包含“£”数据的转储文件导入 MySQL?
- visual-studio-mac - 如何在 Visual Studio for Mac 的外部终端中运行控制台应用程序?
- python-3.x - 如何将shell变量传递给python virtualenv?