scala - 方法重载中的类型擦除问题
问题描述
我有两个具有以下签名的重载方法-
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
}
}
我面临的这种方法有两个问题 -
- 如何使用 Seq 中的值?
- 我怎样才能避免
Should not come here
案例?
提前致谢。
解决方案
尝试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
(这可能是一个缺点,比如说,如果我们关心包大小)。
推荐阅读
- html - 我们在使用称为“请求”的 python 库时从网页请求 cookie 后获得的字符串中存储的信息是什么?
- d3.js - 如何更新任何 d3js 图表以显示实时数据?
- android - 在运行时更改 AR 核心中对象的纹理
- html - 如何在彼此不直接链接的角度组件之间共享数据?
- java - Renjin 支持哪些 R 版本?
- android - onSaveInstanceState 和 onRestoreInstanceState 不恢复列表视图状态
- mysql - 由于维护,Compute Engine 上的 MySQL 未正确关闭
- substrate - Substrate transaction per second performance
- apache-kafka - Producer 如何决定它必须将消息放在哪个 Partition 中?
- python - 模拟量子谐振子/SHM