Scala - 在使用案例类尝试获取TypeTag时没有TypeTag可用异常?

Jas*_*onG 18 reflection types scala

我正在看scala反射API,我有很多例外.

Doc参考:http: //docs.scala-lang.org/overviews/reflection/environment-universes-mirrors.html

如何从通用中获取typetag?

  def getChildSettings[T: ru.TypeTag](path: String, settingsParameterObject: T) = {

    import scala.reflect.runtime.{ currentMirror => m }

    val m = ru.runtimeMirror(getClass.getClassLoader)
    val classC = ru.typeOf[T].typeSymbol.asClass
}
Run Code Online (Sandbox Code Playgroud)

我得到一个例外:

No TypeTag available for ParameterObject.type
Run Code Online (Sandbox Code Playgroud)

即使是一个非常简单的例子似乎也不起作用(在repl中编辑是的)

import scala.reflect.runtime.universe._
import scala.reflect.runtime.currentMirror
import scala.reflect.runtime.{universe => ru}

def getTypeTag[T: ru.TypeTag](obj: T) = ru.typeTag[T]

case class ParameterObject(stringType: String, optionType: Option[String])

getTypeTag(ParameterObject)
Run Code Online (Sandbox Code Playgroud)

我猜它是关于我如何调用该方法的.

Jas*_*onG 39

我终于找到了问题所在.案例类必须在顶级定义 - 它们不能嵌套.这样的事情会失败.

class Foo {
  describe("getSettings") {
    case class ParameterObject(foo: String)
    settings.getTypeTag(path, ParameterObject)
  }
}

class Clazzy {
      def getTypeTag[T: TypeTag](obj: T) = ru.typeTag[T]
}
Run Code Online (Sandbox Code Playgroud)

  • 每个读这篇文章的人都会看到雅罗斯拉夫的回答.您可以_either_将所有类移动到顶层并继续使用`typeOf` /`TypeTag` _or_将它们保持原样并使用`weakTypeOf` /`WeakTypeTag`代替.(如果两个函数都有效,它们会产生相同的输出.) (2认同)

Yar*_*lav 9

如果需要嵌套类的类型标记,可以使用WeakTypeTag.我不知道为什么,但那是故意的.


小智 9

请在运行主类之前声明Case类

case class Person(name: String, age: Long)

def main(args: Array[String]) {
   ...
    val people = sc.textFile("C:\\winutils\\people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF()
Run Code Online (Sandbox Code Playgroud)