首页 > 解决方案 > 方法重载中的类型擦除问题

问题描述

我有两个具有以下签名的重载方法-

def fun(x: Seq[String]): Future[Seq[Int]] = ???
def fun(x: Seq[(String, String)]): Future[Seq[Int]] = ???

由于类型擦除,这些方法不能重载,因此显示编译错误。我尝试使用类型标签作为解决方法 -

def fun[t: TypeTag](values: Seq[T]): Future[Seq[Int]] = {
    typeOf[T] match {
        case t if t =:= typeOf[String] => ???
        case t if t =:= typeOf[(String, String)] => ???
        case _ => ???    // Should not come here
     }
}

我面临的这种方法有两个问题 -

  1. 如何使用 Seq 中的值?
  2. 我怎样才能避免Should not come here案例?

提前致谢。

标签: scalagenericsreflectiontype-erasure

解决方案


尝试DummyImplicit方法而不是TypeTag

def fun(x: Seq[String]): Future[Seq[Int]] = ???
def fun(x: Seq[(String, String)])(implicit ev: DummyImplicit): Future[Seq[Int]] = ???

如何使用 Seq 中的值?

请注意,即使TypeTag启用克服类型擦除,我也不认为编译器会自动插入强制转换,因此您将手动调用asInstanceOf或等效

case t if t =:= typeOf[String] => 
  val vs: Seq[String] = values.asInstanceOf[Seq[String]]
  ???

作为旁注,TypeTag需要依赖scala-reflect.jar(这可能是一个缺点,比如说,如果我们关心包大小)。


推荐阅读