scala - Scala按类型参数过滤并返回构造返回类型与类型构造函数
问题描述
我有以下工作代码
case class FilterType[A](t: GenTraversable[A]) {
def filterType[B](implicit tag: ClassTag[B]): GenTraversable[B] = t.flatMap {
case element: B => Some(element)
case _ => None
}
}
有了这个定义,我可以按预期过滤以下内容
trait Demo
case class Demo1(a: String) extends Demo
case class Demo2(a: Int) extends Demo
val input: Seq[Demo] = Seq(Demo1("hello"), Demo2(2))
val output: GenTraversable[Demo1] = FilterType(input).filterType[Demo1]
我想对此进行改进,并将类型构造函数也作为参数,这样我就可以返回与(在本例中为 a )GenTraversable
相同的类型,而不是返回 a 。我的尝试如下input
Seq
case class FilterType2[T[_]: GenTraversable, A](t: T[A]) {
def filterType[B](implicit tag: ClassTag[B]): T[B] = t.flatMap {
case element: B => Some(element)
case _ => None
}
}
但是我收到以下编译错误:
Error 1: type T takes type parameters
Error 2: value flatMap is not a member of type parameter T[A]
解决方案
对于您的第一个错误:
GenTrasversable
不是上下文/类型类。您期望的是 的子类GenTrasversable
,而不是其上下文,因此您应该使用<:
而不是:
.
对于您的第二个错误:
flatMap
不属于GenTrasversable
。它属于GenTraversableLike
:doc
工作代码:
您还需要CanBuildFrom
在 Scala 2.12 中构建通用集合。
case class FilterType[T[A] <: GenTraversableLike[A, T[A]], A](t: T[A]) {
def filterType[B](implicit tag: ClassTag[B], bf: CanBuildFrom[T[A], B, T[B]]): T[B] = t.flatMap {
case element: B => Some(element)
case _ => None
}
}
完整代码:代码
推荐阅读
- ms-access - 使用 MS-Access 和 VBA 时如何确定 SharePoint 是否在线
- python - url请求Python超出了最大重试次数
- python-3.x - “Image.fromarray”在大尺寸图像中导致“OverflowError:size does not fit in an int”错误
- javascript - 添加和删除子元素
- linux - 如何使用该 Ubuntu 服务器自动/定期将文件从 FTP 服务器复制到不同的 Ubuntu 服务器?
- computational-geometry - 点云更新的最佳数据结构?
- python-3.x - 希望创建一种有效的方式来显示非二叉树结构
- python - TypeError: load() 接受 1 个位置参数,但给出了 2 个。tensorflowjs 转换器错误
- java - 下载的视频无法在 Android 版本 <= 6.1 上播放
- ksh - 制表符完成第二个命令