【问题标题】:How to Pass dynamic type to a method already having generic type in scala如何将动态类型传递给已经在scala中具有泛型类型的方法
【发布时间】:2021-07-17 04:40:17
【问题描述】:

我有一个方法:

object Object1{
def method1[T >: Null: ClassTag: TypeTag](input: String): T = {
    val m = new ObjectMapper() with ScalaObjectMapper
    m.registerModule(DefaultScalaModule)
    Option(input)
      .map(m.readValue[T](_, classTag[T].runtimeClass.asInstanceOf[Class[T]]))
      .orNull
  }
}

我想动态地将类型传递给这个方法,我试过这样:

import spark.implicits._

def getHome[T](s: Dataset[Sig], someString: String): Dataset[T] = {
    s.filter(s => (s.sType == someString))
      .map(s => Object1.method1[T](s.sDetails))
  }

但我收到错误:没有为参数evidence$6 找到隐含。 我还导入了implicits。在 Scala 中实现上述逻辑的最佳方法是什么?

【问题讨论】:

    标签: scala generics


    【解决方案1】:

    您正在尝试将更宽类型的值 T 传递给更窄类型的 T >: Null: ClassTag: TypeTag 并且这永远不会正常。您必须在getHome 的类型参数中添加相同(或更好)的类型约束:

    def getHome[T >: Null: ClassTag: TypeTag](s: Dataset[Sig], someString: String): Dataset[T] = {
    

    感觉method1 应该使用Manifest 类型类而不是ClassTagTypeTag。这可能会简化一些事情,因此请查看ScalaObjectMapper 的文档。

    【讨论】:

    • Manifest 已被弃用,但这可以简化为:根本不需要TypeTag,也不需要白白提及classTag:只需Option(input).map(m.readValue[T]) 应该工作。
    • latest version of ObjectMapper 仍然使用Manifest 但也许有来自TypeTag 的隐式转换?
    • 来自ClassTag,是的...ManifestClassTag 的子类,但我不确定它是如何以另一种方式工作的...魔术:)
    • 任何足够高级的隐式使用都与魔术没有区别:)
    • 谜团解开了:它实际上不起作用 :D 毕竟必须是Manifest ...
    猜你喜欢
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多