[英]How to create a Map constructor using Map([K,V]) instead of Map[K,V]?
在使用例如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
只接受一個類型參數。
我認為主要的挑戰是您必須有一種方法來確保單個參數是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]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.