繁体   English   中英

通过在Scala中使用TypeTag实现多态返回类型

[英]Polymorphic return type by using TypeTag in Scala

我想做的是通过使用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]

如何提前获取元素类型?

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

trait Parent[T]

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

object SomeClass {
  def of[A: Parent]: Parent[A] = implicitly
}

这样可以确保所有操作都在类型级别完成,以便获得所需的返回类型。 它需要IntChildStringChildimplicit修饰符。 不需要另一个名为T类型参数,因为它在您的示例中始终与A相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM