当前位置: 首页 > 面试题库 >

如何在Java中获取Scala的TypeTag和ClassTag

郎鸿朗
2023-03-14
问题内容

我正在编写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


问题答案:

您要针对通用对象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编写等效的代码。)



 类似资料:
  • 问题内容: 我试图在另一个问题中从Spark库调用。并且,它要求两个参数,一个文字对象,它的类型(A )。 第一个论点,我可以提出自己(我认为)。但是对于第二个对象,我不知道如何为它实例化一个对象。我正在尝试通过作为第二个参数。 有人可以告诉我如何在 Java中* 创建for 吗?这是我要完成的代码: * 问题答案: 在另一个问题中,我说 并从Java提供CanBuildFrom自变量在技术上是可

  • 问题内容: 我想创建一个遵循Scala setters / getters约定的Java类。 我尝试了以下简单的课程,但它不起作用: 但是,当我尝试从scala访问它时: 并且我收到“向val重新分配”的错误消息。我试图寻找这个问题,但是所有问题都从scala到Java出现了。 正确的做法是什么? 谢谢! 问题答案: 您只能这样做,而且您可能不想这样做已经足够困难。 您 不能 做的是编写一个裸露的

  • 我想从Kafka中提取CN。如何用Java从X509Certificate中提取CN?帮助我解决了这个问题,但问题是从X509certificate中提取CN,我花了很多时间来为我自己的问题找到正确的解决方案。我想我的解决方案可以帮助某人更快地得到正确的答案。

  • 问题内容: 我有一个Java API,它返回的列表如下: 我正在使用以下scala代码: 现在,如果我尝试使用scala语法糖,例如: 这是行不通的。我得到错误: 看来我需要将Java列表转换为Scala列表。在上述情况下该怎么做? 问题答案: 从 Scala 2.8开始, 此转换现在已使用以下语言构建: 作品。不工作 在2.12.x中使用 在2.13.x中使用

  • 问题内容: 不使用任何外部库,将网站的HTML内容提取为String的最简单方法是什么? 问题答案: 我目前正在使用此: 但不确定是否有更好的方法。