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)
小智 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)