我正在查看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)
我猜这是关于我如何调用该方法的。
答案 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);
?>