2017-10-10 120 views
0

在使用例如Iterable接口時,似乎使用元組形式。然而,Map類型的構造函數需要兩個類型參數,而Iterable只需要一個(一個2元組)。如何使用Map([K,V])而不是Map [K,V]創建Map構造函數?

總之,我想要做的事情如: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

你能說明一下這種情況嗎? –

+0

@IonuţG.Stan - 當然,我更新了我的問題。 – bbarker

回答

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]

+0

這非常有趣,可能適用於很多情況 - 謝謝!我會盡力稍後再回來查看是否可以使用原始的'I [B]'簽名或以某種方式解決此問題 - 有我需要移動的很多類型。 – bbarker

+0

我遇到的一個問題是其他隱式參數使用'I [B]'。 – bbarker

相關問題