2017-10-10 72 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

相关问题