我需要创建一个临时
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
来实现相同的目的?
考虑到数组实现将在擦除后使用
,无论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
从编译时到运行时的信息。