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

时间:2013-06-07 16:11:01

标签: scala reflection types

我正在查看scala反射API,但我遇到了很多例外。

文档参考: 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
}

我得到一个例外:

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)

我猜这是关于我如何调用该方法的。

5 个答案:

答案 0 :(得分:37)

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

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

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

答案 1 :(得分:9)

如果您需要嵌套类的类型标记,则可以使用WeakTypeTag。我不知道为什么,但是that's intentionally

答案 2 :(得分: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()

答案 3 :(得分: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给出了获取和调用构造函数的示例。

答案 4 :(得分:3)

在pom.xml中添加此代码

<?php

header('Content-Type: text/html; charset=utf-8');
$text = explode(" ", strip_tags("words altered added and removed to make it")); 
$stack = array();

$words = array("altered", "added", "something"); 
foreach($words as $keywords){
   $check = array_search($keywords, $text);
   if($check>(-1)){
     $replace = " ".$text[$check].","; 
   $result = str_replace($text[$check], $replace, $text);
    array_push($stack, $result);
   }
}

print_r($stack);
?>