如何在Java中获取Scala的TypeTag和ClassTag

我正在编写Java代码,其中需要调用这样定义的Scala函数:

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

在Scala中,我将简单地调用func String Java代码应类似于:func(“ a”,arg1,arg2),其中arg1是TypeTag

,而arg2是ClassTag

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

回答:

您要针对通用对象T还是特定对象?对于泛型,没有办法做到,而是接受ClassTag<T>TypeTag<T>作为参数(就像Scala代码实际上所做的那样)。具体来说,我建议在Scala中编写一个包装器,例如def

func_String(name: String) = func[String](name),从Java调用它。

或更笼统地讲,但是不合要求的复杂:

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编写等效的代码。)

以上是 如何在Java中获取Scala的TypeTag和ClassTag 的全部内容, 来源链接: utcz.com/qa/425809.html

回到顶部