gpt4 book ai didi

scala - 如何为自定义 Scala 集合实现 newBuilder(具有正确的方差)?

转载 作者:行者123 更新时间:2023-12-02 03:28:21 25 4
gpt4 key购买 nike

我正在尝试实现一个遵循相同习惯用法的新集合类型作为标准库,但我无法弄清楚如何处理 Builder力学。我已经阅读了优秀的 "Architecture of ScalaCollections" docpage ,但它不包括我的情况。

这是我正在尝试做的事情的简化版本:

import scala.collection.TraversableLike
import scala.concurrent.Future

trait AsyncMap[A, +B]
extends Traversable[(A, B)]
with TraversableLike[(A, B), AsyncMap[A, B]]
{

def empty: AsyncMap[A, B]

// This is the main difference from scala.collection.Map (an AsyncMap doesn't
// block while it checks if it contains an element for a given key).
def get(key: A): Future[Option[B]]

def +[B1 >: B](kv: (A, B1)): AsyncMap[A, B1]

}

编译上面的代码给我一个错误:

error: overriding method newBuilder in trait TraversableLike of type => scala.collection.mutable.Builder[(A, B),AsyncMap[A,B]];
method newBuilder in trait GenericTraversableTemplate of type => scala.collection.mutable.Builder[(A, B),Traversable[(A, B)]] has incompatible type
trait AsyncMap[A, +B]
^

认为这是在提示GenericTraversableTemplate有混凝土newBuilder签名不兼容的实现那个TraversableLike在寻找。我不明白的是我是如何可以解决这个问题。

实现 newBuilder: Builder[(A, B), Traversable[(A, B)]]产生这个错误:

error: overriding method newBuilder in trait TraversableLike of type => scala.collection.mutable.Builder[(A, B),AsyncMap[A,B]];
method newBuilder has incompatible type
override def newBuilder: Builder[(A, B), Traversable[(A, B)]] = {
^

在执行 newBuilder: Builder[(A, B), AsyncMap[A, B]] 时产生这个错误:

error: covariant type B occurs in contravariant position in type => scala.collection.mutable.Builder[(A, B),AsyncMap[A,B]] of method newBuilder
override def newBuilder: Builder[(A, B), AsyncMap[A, B]] = {
^

我认为我采用后一种方法是正确的,但我不确定如何在此处指定方差。

我还尝试通过实现一个 trait AsyncMapLike[A, +B, +This <: AsyncMapLike[A, B, This] with AsyncMap[A, B]] ,但这种方法没有取得任何成果。

我应该承认我对 Scala 很陌生,虽然我认为我理解它类型系统 我可能不知道某些类型运算符或简单的设计模式解决了这个问题。

如有任何帮助,我们将不胜感激。


可能相关的问题:

最佳答案

作为mucaho帮助我在上面的评论中发现,事实证明我的问题是由缺少访问修饰符引起的。关于方差的错误消息对我来说仍然没有意义(我已经打开了一个关于它的新问题:Why does scalac only emit variance errors with certain access modifiers?),但是当我用访问权限为 的具体实现覆盖 newBuilder 时>protected[this],一切都按预期工作(之前我一直试图将其公开)。

import scala.collection.mutable.Builder
import scala.collection.TraversableLike
import scala.concurrent.Future

trait AsyncMap[A, +B]
extends Traversable[(A, B)]
with TraversableLike[(A, B), AsyncMap[A, B]]
{
def empty: AsyncMap[A, B]

def get(key: A): Future[Option[B]]

def +[B1 >: B](kv: (A, B1)): AsyncMap[A, B1]

// This works!
override protected[this] def newBuilder: Builder[(A, B), AsyncMap[A, B]] = ???
}

关于scala - 如何为自定义 Scala 集合实现 newBuilder(具有正确的方差)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28947134/

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