我写Java代码中,我需要调用是像这样定义的斯卡拉功能:如何获得Scala的TypeTag和ClassTag在java中
def func[T: TypeTag: ClassTag ](name: String): RDD[T] = ...
在斯卡拉我倒是简单的调用FUNC字符串 的Java代码应该是这样的:FUNC( “A”,ARG1,ARG2) ,其中Arg1是TypeTag < T>和ARG2是ClassTag < T>
我不知道如何生成ARG1和ARG2在Java
我写Java代码中,我需要调用是像这样定义的斯卡拉功能:如何获得Scala的TypeTag和ClassTag在java中
def func[T: TypeTag: ClassTag ](name: String): RDD[T] = ...
在斯卡拉我倒是简单的调用FUNC字符串 的Java代码应该是这样的:FUNC( “A”,ARG1,ARG2) ,其中Arg1是TypeTag < T>和ARG2是ClassTag < T>
我不知道如何生成ARG1和ARG2在Java
Do y你想为通用T
或特定的一个吗?对于泛型,没有办法做到这一点,接受ClassTag<T>
和TypeTag<T>
作为参数(就像Scala代码实际上一样)。具体来说,我建议在Scala中编写一个包装器,例如def func_String(name: String) = func[String](name)
并从Java调用它。
或者更一般地,但不希望复杂:(你可以用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)
}
通过在Scala中添加通用解决方案解决了我的问题。为了完整起见,也许您可以发布Java解决方案,以便那些仅限于Java的人仍然可以得到他们的答案(因为这是我最初的意图),非常感谢您! –
在http://stackoverflow.com/a/23001058/看看3314107,我认为它可能有帮助。 – stefanobaghino