2016-07-26 66 views
0

我写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

+0

在http://stackoverflow.com/a/23001058/看看3314107,我认为它可能有帮助。 – stefanobaghino

回答

1

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) 
} 

+1

通过在Scala中添加通用解决方案解决了我的问题。为了完整起见,也许您可​​以发布Java解决方案,以便那些仅限于Java的人仍然可以得到他们的答案(因为这是我最初的意图),非常感谢您! –