ClassTag仅保留类型参数的顶级类型,即给定以下类型: Seq[List[Int]] ,类型参数为List[Int] ,但仅保留ListInt丢失

def mkArray[T: ClassTag](data: T*) = Array(data: _*)
val data = Seq(List(1), List(2), List(3))
val arr = mkArray(data)

在调用mkArray创建数组时,应该丢失Int for List[Int] ,因此为什么创建的数组具有其元素的正确类型,即List [Int]

#1楼 票数:2

底层Java数组在运行时知道其元素的擦除类型。 编译器知道编译时的准确时间。

scala> val xs = Array(List(1))
xs: Array[List[Int]] = Array(List(1))

scala> xs.getClass.getComponentType
res0: Class[_] = class scala.collection.immutable.List

scala> val vs = xs.asInstanceOf[Array[List[String]]]
vs: Array[List[String]] = Array(List(1))

scala> vs(0) = List("hi")

scala> xs
res2: Array[List[Int]] = Array(List(hi))

#2楼 票数:0

该信息会在运行时从类型擦除中丢失,但不会在编译时丢失。

  ask by Tom translate from so

未解决问题?本站智能推荐:

1回复

试图了解Scala中的ClassTag和TypeTag

我试图了解如何使用ClassTag和TypeTag克服scala中的类型擦除。 我编写了以下示例,这些示例是尝试过滤掉其中TNode等于TMatch List[TNode]通用函数。 不过,我希望在recognizeUsingTypeTag ,函数不得调用extractUsingClassT
1回复

在scala中,如何使用其泛型成员的ClassTag创建专用类的ClassTag?

我们以常见的Array[T]类为例: 这将提供以下输出: 可以观察到,由于 Array 具有专门的类型成员,因此类型String没有被擦除。 我的问题是,如果在编译时不知道String类型。 而你只有一个未知类型T的 ClassTag ,你还能得到 Array[T] 的专用 ClassTag 吗?
1回复

Scala-如何将通用列表转换为数组并避免“T没有可用的ClassTag”

我正在研究什么应该是一段微不足道的代码。 我想获取一个列表,并将其转换为等效的数组: 运行此代码给出: 我怎样才能避免这个问题; 我来自 Python 背景,因此希望得到一个让我了解这里的机制的回复。 谢谢!
1回复

在Scala2.10中,如何在给定TypeTag的情况下创建ClassTag

我想定义一个返回数组的函数,我有一个TypeTag。 我可以生成所需的ClassTag吗? 或者是否有必要提供ClassTag的隐含证据: 我认为从TypeTag生成ClassTag很简单,但我没有看到明显的方法。
1回复

了解多维数组创建过程中的参数类型

我正在尝试解析在以下代码中创建的参数类型type _1 >: Char with Int <: AnyVal (使用 Scala ammonite repl)。 我正在定义一个数组数组 在这种情况下with是什么意思,我们是否定义了一个具有 Int 'traits' 的新 Char 类?
1回复

隐式classTag和currying

我试图编写一个不返回最后一个参数的foldLeft函数,并且我也需要对其进行参数化。 我需要一个ClassTag作为此参数,但是似乎无法同时拥有implicit ClassTag和为完成功能的范围留出空间: foldArgs的最后一行需要将ClassTag[C]传递给fields ,但是如
1回复

如何获取特殊类型的ClassTag?

隐式ClassTag参数是错误的。 scala.Tuple2不是i的类。 正确的ClassTag适用于scala.Tuple2$mcII$sp 。 当我们使用Kryo进行序列化时,这种行为对我们来说是个问题。 您给readObject一个Class参数。 当我们从ClassTag获取
1回复

没有可用的ClassTag(Scala)

我在 Scala 发生了一些奇怪的事情。 我正在尝试使用第三方库org.apache.spark.streaming.kafka.KafkaUtils.createDirectStream 并获得 No ClassTag 异常。 我模拟了下面的场景,因为人们可以将 Util 视为第三方库。 为什么会