簡體   English   中英

Scala-沒有TypeTag可用當使用案例類嘗試獲取TypeTag時發生異常嗎?

[英]Scala - No TypeTag Available Exception when using case class to try to get TypeTag?

我正在查看scala反映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)

我猜想這與我如何調用該方法有關。

我終於發現了問題所在。 案例類必須在頂層定義-它們不能嵌套。 這樣的事情會失敗。

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

class Clazzy {
      def getTypeTag[T: TypeTag](obj: T) = ru.typeTag[T]
}

如果您需要嵌套類的類型標簽,則可以使用WeakTypeTag。 我不知道為什么,但這是有意的

在運行主類之前,請先聲明案例類

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()

您需要在編譯時使用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文檔概述給出了獲取和調用構造函數的示例。

將此代碼添加到pom.xml中

<dependency>
    <groupId>org.scala-lang</groupId>
    <artifactId>scala-reflect</artifactId>
    <version>2.12.0-M4</version>
</dependency>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM