2016-07-26 1 views
0

Je vous écris du code Java dans lequel je dois appeler une fonction Scala qui est définie comme ceci:Comment obtenir typetag de scala et ClassTag en java

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

Scala j'avais simple appel func Chaîne Le Le code Java doit être quelque chose comme: func ("a", arg1, arg2) où arg1 est un typetag < T> et arg2 est un ClassTag < T>

Je ne sais pas comment générer arg1 et arg2 en java

+0

Jetez un oeil à http://stackoverflow.com/a/23001058/ 3314107, je pense que cela peut être utile. – stefanobaghino

Répondre

1

A faire Vous voulez le faire pour T générique ou pour un spécifique? Pour générique, il n'y a aucun moyen de le faire, accepter ClassTag<T> et TypeTag<T> comme arguments à la place (tout comme le code Scala fait réellement). Pour plus précis, je suggère d'écrire un emballage dans Scala, par exemple. def func_String(name: String) = func[String](name) et en l'appelant depuis Java.

Ou plus génériquement, mais complexe non souhaitable: (. Vous pouvez écrire l'équivalent en Java ainsi)

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

a résolu mon problème en ajoutant la solution générique dans Scala. Par souci d'exhaustivité, vous pouvez peut-être également publier la solution Java pour que ceux qui sont limités à Java puissent toujours obtenir leur réponse (comme c'était mon intention initiale dans la question), merci beaucoup! –