java中如何获取scala的TypeTag和ClassTag [英] How to get scala's TypeTag and ClassTag in java

查看:58
本文介绍了java中如何获取scala的TypeTag和ClassTag的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写 Java 代码,我需要在其中调用定义如下的 Scala 函数:

I am writing Java code in which I need to call a Scala function that is defined like so:

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

在 Scala 中,我会简单地调用 func StringJava 代码应该类似于: func( "a" , arg1 , arg2 )其中 arg1 是 TypeTag 和 arg2 是一个 ClassTag<;>

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 >

我不知道如何在 java 中生成 arg1 和 arg2

I am not sure how to generate arg1 and arg2 in java

推荐答案

你想为通用的 T 还是特定的?对于泛型,没有办法做到这一点,而是接受 ClassTagTypeTag 作为参数(就像 Scala 代码实际上所做的那样).具体来说,我建议在 Scala 中编写一个包装器,例如def func_String(name: String) = func[String](name) 并从 Java 调用它.

Do you want to do it for generic T or for specific one? For generic, there is no way to do it, accept ClassTag<T> and TypeTag<T> as arguments instead (just like Scala code actually does). For specific, I'd suggest writing a wrapper in Scala, e.g. def func_String(name: String) = func[String](name) and calling it from 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)
}

(你也可以用 Java 编写等价物.)

(you could write the equivalent in Java as well.)

这篇关于java中如何获取scala的TypeTag和ClassTag的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆