22

我正在查看 scala reflect API,我遇到了很多异常。

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

如何从泛型中获取类型标签?

  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
}

我得到一个例外:

No TypeTag available for ParameterObject.type

即使是一个非常简单的示例似乎也不起作用(编辑是的,它在 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)

我猜这与我如何调用该方法有关。

4

5 回答 5

48

我终于发现了问题所在。案例类必须定义在顶层——它们不能嵌套。这样的事情会失败。

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

class Clazzy {
      def getTypeTag[T: TypeTag](obj: T) = ru.typeTag[T]
}
于 2013-06-07T18:37:55.600 回答
14

请在运行主类之前声明案例类

例子

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()
于 2016-04-19T03:32:41.233 回答
9

如果你需要嵌套类的类型标签,你可以使用 Wea​​kTypeTag。我不知道为什么,但这是故意的

于 2014-08-22T18:05:52.830 回答
4

Add this code in your pom.xml

<dependency>
    <groupId>org.scala-lang</groupId>
    <artifactId>scala-reflect</artifactId>
    <version>2.12.0-M4</version>
</dependency>
于 2016-05-24T13:35:08.893 回答
3

您需要TypeTag在编译时,因为这是解决擦除的方法:

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

def getChildSettings[T: TypeTag](path: String, settingsParameterObject: T) = {
  val tpe    = ru.typeOf[T]
  // val classC = tpe.typeSymbol.asClass
  val ctor   = tpe.declaration(ru.nme.CONSTRUCTOR).asMethod
  ...
}

Scala Documentation Overview for Reflection给出了获取和调用构造函数的示例。

于 2013-06-07T16:22:04.737 回答