【问题标题】:Polymorphic return type by using TypeTag in Scala在 Scala 中使用 TypeTag 的多态返回类型
【发布时间】:2019-06-27 19:27:08
【问题描述】:

我想要做的是使用 TypeTag 在 Scala 函数中返回泛型类型。这是示例代码。

trait Parent[T]

object IntChild extends Parent[Int]
object StringChild extends Parent[String]

object SomeClass {
  def of[A: TypeTag]: Parent[T] = {
    getElementType[A] match {
      case Int => IntChild
      case String => StringChild
    }
  }
}

SomeClass.of[Array[Int]]

但它会引发编译错误。因为of方法的返回类型在编译类型中是不固定的。有没有办法从 TypeTag 中获取类型信息并将类型嵌入到返回的类型中?

我期待的是什么

// T is inferred from TypeTag A.
def of[A: TypeTag, T]: Parent[T] = {
  //...
}

我发现这段代码也没有通过编译。所以我们需要修复从 A 的 TypeTag 推断出的类型信息。

def of[A: TypeTag]: Parent[_] = {
  //...
}

这是错误。

type mismatch;
[error]  found   : Array[Int]
[error]  required: Array[_$1]

如何提前获取元素类型?

【问题讨论】:

    标签: scala types compiler-errors type-systems


    【解决方案1】:

    我不确定这些定义是否可行。稍微改变一下定义怎么样?

    trait Parent[T]
    
    implicit object IntChild extends Parent[Int]
    implicit object StringChild extends Parent[String]
    
    object SomeClass {
      def of[A: Parent]: Parent[A] = implicitly
    }
    

    这确保一切都在类型级别完成,以便您获得所需的返回类型。它需要IntChildStringChild 上的implicit 修饰符。无需使用另一个名为 T 的类型参数,因为它始终与您的示例中的 A 相同。

    【讨论】:

    • 实际上,它适用于我的情况。这对我很有帮助。谢谢!
    • @Kai Sasaki 如果回答对你有帮助,你能接受吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    相关资源
    最近更新 更多