gpt4 book ai didi

generics - Scala 类型构造函数的误解

转载 作者:行者123 更新时间:2023-12-04 14:35:33 25 4
gpt4 key购买 nike

我正在尝试编写一个方法,该方法采用 Map[K, Collection[V]] 并将其转换为具有不同类型 Collection 值的映射。该方法采用“multimap”和一个构建新集合的构建器。我像这样使用它:

val multimap = new java.util.HashMap[Int, java.util.List[String]]
multimap.put(1, Arrays.asList("One"))
multimap.put(2, Arrays.asList("Two", "Three"))

val mapOfLists: java.util.Map[Int, java.util.Set[String]] =
asMap(multimap, Builder.SET)

这是构建器的样子:
trait Builder[C[_] <: java.util.Collection[_]]
{
def create[V]: C[V]
}

object Builder
{
val SET = new Builder[java.util.Set]()
{
def create[V]: java.util.Set[V] = new java.util.HashSet[V]
}
}

下面是 asMap() 的实现。它有效,但我不明白 - 为什么我最后需要类型转换?
def asMap[K, V, C[_] <: java.util.Collection[_]](
multimap: java.util.Map[K, _ <: java.util.Collection[V]], builder: Builder[C]): java.util.Map[K, C[V]] =
{
val result = new java.util.HashMap[K, C[V]]
val iterator: Iterator[K] = multimap.keySet.iterator
while (iterator.hasNext)
{
val key = iterator.next
val collection: C[V] = builder.create[V]
collection.asInstanceOf[java.util.Collection[V]].addAll(multimap.get(key))
result.put(key, collection)
}
result
}

如果没有类型案例,我会收到此错误:
[ERROR] error: type mismatch;
[INFO] found : java.util.Collection[V]
[INFO] required: java.util.Collection[_ <: _$2] where type _$2
[INFO] collection.addAll(multimap.get(key))

最佳答案

您不小心创建了存在类型而不是类型构造函数。有效的类型构造函数是 C[X] <: Collection[X|所以你需要改变Builder

trait Builder[C[X] <: Collection[X]] {
def create[V]: C[V]
}

asMap的签名到
def asMap[K, V, C[X] <: Collection[X]](multimap: Map[K, _ <: Collection[V]],
builder: Builder[C]): Map[K, C[V]]

关于generics - Scala 类型构造函数的误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3409808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com