使用元组表单似乎在使用例如Iterable
接口时处理。但是,Map
类型构造函数采用两个类型参数,而Iterable
只采用一个(2元组)。
简而言之,我想做一些像type Map[(+A, +B)] = Map[A, B]
这样的事情,但这是无效的Scala代码。然后我可以说:
type MapItem = (K,V)
type MyMap = Map[MapItem]
我目前使用的示例用例是我的函数定义如下:
def requestDecodeIterable[B, I[X] <: Iterable[X]](reqRx: Rx[HttpRequest])
(implicit stuff ...): Rx[I[B]] = ...
我希望能够这样称呼它:
type CodebookNameItem = (CodebookId, CodebookName)
type CodebookNameCollection[+A, +B] = Map[A, B]
requestDecodeIterable[CodebookNameItem, CodebookNameCollection](request)
但是,这当然不起作用,因为CodebookNameCollection
有两个类型参数,但I
只接受一个类型参数。
答案 0 :(得分:1)
我认为主要的挑战是你必须有办法确保单个参数是一个Tuple2,然后从中获取各个类型。
我不确定这种类型语句是否可行,但您可以这样做:
trait CanBuildIterable[A, B] {
type Out <: Iterable[B]
}
implicit def defaultCanBuildIterable[A[X] <: Iterable[X], B] = new CanBuildIterable[A[_], B] {
type Out = A[B]
}
implicit def mapCanBuildIterable[K, V] = new CanBuildIterable[Map[_, _], (K, V)] {
type Out = Map[K, V]
}
def requestDecodeIterable[B, I](reqRx: Rx[HttpRequest])
(implicit cbi: CanBuildIterable[I, B], ... other implicits ...): Rx[cbi.Out] = ...
然后,您可以将其称为requestDecodeIterable[CodebookNameItem, Map[_, _]]
,返回类型为Map[CodebookId, CodebookName]
。