我有一个协变的 Scala 类型Thing[+B]
。该实现使用内部可变队列:
private val queue : AsyncQueue[B]()
AsyncQueue 是一个自定义的可变队列实现,具有我无法在不可变版本中轻松实现的特殊属性。因为它是可变的,所以 AsyncQueue 是不变的。所以我不能在我的协变类型中使用它Thing
。
由于queue
是私有的,我可以保证我的代码的正确性:例如,我不会尝试分配queue
给 type 的引用Queue[Any]
。如何在不使用强制转换的情况下使这项工作保持Thing
协变?B
(使用 cast 的解决方案是在 enqueue/dequeue 上声明一个AsyncQueue[Object]
和 cast 对象,这非常难看。)
ETA:我了解类型协变,并且我了解为什么我不能声明协变类型的 AsyncQueue 或使 AsyncQueue 本身协变。我的问题是如何设计此代码以避免在任何地方使用强制转换。