scala - 两个相关的存在类型参数
问题描述
让我们看这个示例代码:
trait DataProcessor[D] {
def computeData(): D
}
case class DataItem[D, P <: DataProcessor[D]](processor: P, data: D)
def computeDataFromItems(items: Set[DataItem[_, _]]) = items collectFirst {
case DataItem(s: DataProcessor[_], d) =>
s.computeData()
}
使用 Scala 2.11 编译时,会产生以下错误:
Error:(8, 77) type arguments [_$1,_$2] do not conform to class DataItem's type
parameter bounds [D,P <: TwoExistentials.DataProcessor[D]]
def computeDataFromItems(items: Set[DataItem[_, _]]) = items collectFirst {
似乎该collectFirst
方法需要更多类型信息,这些信息不包含在类的存在类型对中DataItem
。
是否有机会为方法的参数提供更具体的类型,例如:
def computeDataFromItems(items: Set[DataItem[D, P] forSome { type D, type P <: DataProcessor[D] }])
不幸的是,哪个没有编译?
否则,有没有办法允许以类型安全的方式在集合中使用具有两个相关类型参数的类?
顺便说一句,我已经考虑过使用无形的,而不是存在的类型。但我正在寻找经典 Scala 集合的实现。
解决方案
这应该编译(替换,
为;
):
def computeDataFromItems(items: Set[DataItem[D, P] forSome { type D; type P <: DataProcessor[D] }])
推荐阅读
- node.js - 在 electronjs 应用程序中崩溃时重新启动 nodejs 服务器
- java - ElasticSearch 使用 java API“ScrolledPage.class”,我想要 getId
- c++ - 使用了未初始化的局部变量“快速”
- java - 无法理解此 java 代码的输出
- rx-java - 即使与 defer 一起使用,反应式 zipWith 也不懒惰
- mysql - 当条件对第二个表没有结果时,如何在 LEFT JOIN 上返回 NULL
- go - 开始时遇到困难。`package main`抛出运行时错误-索引超出范围?
- php - 如何创建类似的 php 页面但具有不同的 url
- amazon-ecs - 使用 Fargate 在 AWS 上部署哨兵
- sql - Sql Pivot 准时