[英]How to get scala's TypeTag and ClassTag in java
I am writing Java code in which I need to call a Scala function that is defined like so:我正在编写 Java 代码,我需要在其中调用定义如下的 Scala 函数:
def func[T: TypeTag: ClassTag ](name: String): RDD[T] = ...
In Scala I'd simple call func String The Java code should be something like: func( "a" , arg1 , arg2 ) where arg1 is a TypeTag< T > and arg2 is a ClassTag< T >在 Scala 中,我简单调用 func String Java 代码应该是这样的: func( "a" , arg1 , arg2 ) 其中 arg1 是 TypeTag< T > 和 arg2 是 ClassTag< T >
I am not sure how to generate arg1 and arg2 in java我不确定如何在 java 中生成 arg1 和 arg2
Do you want to do it for generic T
or for specific one?你想为通用T
还是特定的T
做它? For generic, there is no way to do it, accept ClassTag<T>
and TypeTag<T>
as arguments instead (just like Scala code actually does).对于泛型,没有办法做到这一点,而是接受ClassTag<T>
和TypeTag<T>
作为参数(就像 Scala 代码实际所做的那样)。 For specific, I'd suggest writing a wrapper in Scala, eg def func_String(name: String) = func[String](name)
and calling it from Java.具体来说,我建议在 Scala 中编写一个包装器,例如def func_String(name: String) = func[String](name)
并从 Java 调用它。
Or more generically, but undesirably complex:或者更一般地,但不合需要的复杂:
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)
}
(you could write the equivalent in Java as well.) (你也可以用 Java 编写等价物。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.