【问题标题】:How to get scala's TypeTag and ClassTag in java如何在java中获取scala的TypeTag和ClassTag
【发布时间】:2023-04-02 17:20:01
【问题描述】:

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

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

在 Scala 中,我会简单地调用 func String Java 代码应该类似于:func("a", arg1, arg2) 其中 arg1 是 TypeTag 而 arg2 是 ClassTag

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

【问题讨论】:

标签: java scala


【解决方案1】:

你想为通用T 还是为特定的?对于泛型,没有办法做到这一点,而是接受 ClassTag<T>TypeTag<T> 作为参数(就像 Scala 代码实际上一样)。具体来说,我建议在 Scala 中编写一个包装器,例如def func_String(name: String) = func[String](name) 并从 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)
}

(您也可以用 Java 编写等效的代码。)

【讨论】:

  • 通过在 Scala 中添加通用解决方案解决了我的问题。为了完整起见,也许您也可以发布 Java 解决方案,以便那些仅限于 Java 的人仍然可以得到他们的答案(因为这是我在问题中的初衷),非常感谢!
  • 嗨@Alexey,您能否提供相同的Java等效项?
  • 问题:“如何在 Java 中获取 TypeTag?”,回答:“这是 Scala 代码”:)
  • @VB_ 答案的主要部分:“我建议在 Scala 中编写一个包装器,例如 def func_String(name: String) = func[String](name) 并从 Java 调用它”。 Scala 代码也是您可以从 Java 调用的代码。
猜你喜欢
  • 1970-01-01
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 2020-06-28
相关资源
最近更新 更多