如何在java中获取scala的TypeTag和ClassTag

时间:2016-07-26 11:53:28

标签: scala

我正在编写Java代码,我需要在其中调用一个定义如下的Scala函数:

def func[T: TypeTag: ClassTag ](name: String): RDD[T] = ...

在Scala中我简单地调用func String Java代码应该类似于:func(" a",arg1,arg2) 其中arg1是TypeTag< T>和arg2是ClassTag< T>

我不确定如何在java中生成arg1和arg2

1 个答案:

答案 0 :(得分:-1)

您想要针对通用T或特定的ClassTag<T>进行此操作吗?对于泛型,没有办法做到这一点,接受TypeTag<T>def func_String(name: String) = func[String](name)作为参数(就像Scala代码实际上做的那样)。具体来说,我建议在Scala中编写一个包装器,例如: import scala.reflect.ClassTag import scala.reflect.runtime.universe._ def func1[T](name: String, clazz: Class[T]) = { val classTag = ClassTag[T](clazz) val m = runtimeMirror(clazz.getClassLoader) val tpe = m.classSymbol(clazz).toType val typeCreator = new scala.reflect.api.TypeCreator { def apply[U <: Universe with Singleton](m1: scala.reflect.api.Mirror[U]): U # Type = if (m1 != m) throw new RuntimeException("wrong mirror") else tpe.asInstanceOf[U#Type] } val typeTag = TypeTag[T](m, typeCreator) func(name)(typeTag, classTag) } 并从Java调用它。

或者更一般地,但是非常复杂:

{{1}}

(您也可以在Java中编写等效文件。)