如何创建数组[T | Null] 其中 T 是一个类型参数,以 `AnyRef` 作为上限

问题描述 投票:0回答:1

我需要创建一个临时

Array[T | Null]
,其中
T
是类型参数,以
AnyRef
为上限。 鉴于数组实现将在擦除后使用
Array[AnyRef]
,无论
T
是什么,我为什么要中继
ClassTag

def method[T <: AnyRef](elements: Iterable[T])(using ctTorNull: ClassTag[T | Null]): T = 

    val array = elements.toArray[T | Null]
    ???

}

有没有办法在 scala 3.4 中不使用

ClassTag
asInstanceOf
来实现相同的目的?

arrays scala generics scala-3 erasure
1个回答
0
投票

考虑到数组实现将在擦除后使用

Array[AnyRef]
,无论
T
是什么

擦除

Array[T]
(
T <: AnyRef
) 是
Array[AnyRef]
是不正确的。请参阅规格:

参数化类型的擦除

scala.Array[T]
scala.Array[|T|]

(这里

|T|
是删除
T
)。

您可以检查

Array[Int]
Array[String]
在运行时是否有不同的类

classOf[Array[Int]])
classOf[Array[String]]

被删除的是

T
。所以你需要
ClassTag
来保存关于
T
从编译时到运行时的信息。

© www.soinside.com 2019 - 2024. All rights reserved.