【问题标题】:How could assign ArrayBuffer[Implementation] to ArrayBuffer[Interface] in Scala如何在 Scala 中将 ArrayBuffer[Implementation] 分配给 ArrayBuffer[Interface]
【发布时间】:2020-12-21 09:57:38
【问题描述】:

我正在尝试在 Scala 中执行以下操作

val buffer1:ArrayBuffer[Element] = ???
val buffer:ArrayBuffer[IElement] = buffer1

其中IElement是我的自定义接口,Element是实现的一个元素。 但是 scala 编译器向我显示了这样的错误:

ArrayBuffer[Element] 类型的表达式不符合预期的 ArrayBuffer[IElement] 类型

我怎样才能让它通过编译器?
scala ArrayBuffer 支持吗?

【问题讨论】:

  • TL;DR;使用协变的不可变集合,例如 ListVectorArraySeq。 - 如果你不知道方差是什么,那么首先要了解它。

标签: scala arraybuffer


【解决方案1】:

查看here 中的 Scala 类型层次结构。如您所见, Int 类型不是从 Object 扩展的,因此您无法使用 Int 值初始化 ArrayBuffer[Object]。您必须将对象更改为 AnyVal。此外,它的类型是不变的。这意味着两个声明如下:

var buffer:ArrayBuffer[AnyVal] = ArrayBuffer.apply(1)

var buffer2:ArrayBuffer[Int] = ArrayBuffer.apply(1)

它们不一样,所以如果你尝试做类似的事情:

buffer = buffer2

编译器给你以下错误:

error: type mismatch;
        found   : scala.collection.mutable.ArrayBuffer[Int]
        required: scala.collection.mutable.ArrayBuffer[AnyVal]
       Note: Int <: AnyVal, but class ArrayBuffer is invariant in type A.
       You may wish to investigate a wildcard type such as `_ <: AnyVal`. (SLS 3.2.10)

【讨论】:

  • 感谢您的回复,这对我有帮助。但我想我只是写了一个错误的样本来找到我的答案。所以我会编辑我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 2015-09-08
相关资源
最近更新 更多