2016-07-26 3 views
0

Я пишу код Java, в котором мне нужно вызвать функцию Scala, которая определяется следующим образом:Как получить TypeTag и ClassTag SCALA в Java

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

В Scala я бы простой вызов Func Строка В Java код должен быть что-то вроде: FUNC ("а", arg1, arg2) где arg1 является TypeTag < T> и арг2 является ClassTag < T>

Я не уверен, как генерировать arg1 и arg2 в Java

+0

Посмотрите на http://stackoverflow.com/a/23001058/ 3314107, я думаю, это может помочь. – stefanobaghino

ответ

1

Do y ou хотите сделать это для общего 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, все еще могут получить ответ (так как это было моим первоначальным намерением в вопросе), спасибо вам большое! –

Смежные вопросы