gpt4 book ai didi

scala - 专门集合中的 AnyVal 元素是否需要装箱?

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

假设我有一个自定义类,它扩展了 AnyVal 并在内部使用了一个 Long:

case class Instruction(underlying: Long) extends AnyVal

当我将 Instruction 添加到专门用于 Long 的集合时,Instruction 是否需要装箱?

(是否有专门用于 Long 的 Scala 集合?我需要一个索引序列。)

最佳答案

是的,它会被装箱。不幸的是,值类在用作类型参数(泛型)或放入集合中时失去了所有好处。当它们需要被视为任何其他类型而不是完全值类本身的类型时,它们总是被装箱。

该限制的原因是为了保留 Scala 语言的良好语义,这样的代码必须有效:

case class ValueClass(raw: Long) extends AnyVal
val someList: List[Any] = List[ValueClass](ValueClass(42L))
someList.head match {
case ValueClass(raw) => // boxing needed for this match to work...
case _ => ...
}

特化在这里不会改变任何东西,任何集合(专业的或非专业的)都可以传递到它被视为 Coll[Any]Coll[T] 的地方,其中有关确切 元素类型的信息丢失。

如果您想要一个具有未装箱存储的 IndexedSeq[Long],我认为 scala.collection.mutable.WrappedArray.ofLong 是最接近它的东西。它也有相应的构建器,scala.collection.mutable.ArrayBuilder.ofLong

关于scala - 专门集合中的 AnyVal 元素是否需要装箱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46032668/

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