-1

在 Scala 中,在类型擦除期间,泛型变量在泛型变量出现在类型位置的任何地方都被“对象”类型替换。

EG: val x T; --> 被替换为val x Object;

因此,传递的确切类型的详细信息将在运行时变得不可用。

为了克服这个问题(在运行时获得确切的类型),提到 ClassTag 将帮助我们。

你能帮我ClassTag在运行时如何获取类型信息吗?

当提到 ClassTag 时,它也是用上下文绑定的泛型类型编写的。

例如:def method[T:ClassTag] {...}

所以我认为,这里提到的“T”也将被删除。但是 ClassTag 以某种方式保留了类型信息。我有点困惑这是如何工作的..(类似 TypeTag 和 WeakTag 也是如此)

4

1 回答 1

3

这是不正确的:

例如:值 x T;--> 替换为 val x 对象;

的类型x不丢失;您可以在运行时查看 的值x并确定它是什么类型。对象保留其运行时类型。

类型擦除影响参数化类型的值Y[T]。运行时为一个对象保存一个类型,因此它不能同时保存TY“擦除”T该类型。如果我有一个实例,Y[T]我可以在运行时告诉它它是类型Y,但不知道T它是用哪个参数化的。因此我可以区分List[T]Vector[T]不能List[T]区分List[U]。但是其中的一个元素List保留了它的类型,并且可以与Tor匹配Uval x: T并且可以直接匹配一个成员来确定对象的类型。

AClassTag是表示类型的,因此如果将ClassTagof存储T在对象中,则可以匹配它来计算出类型,T而无需查看T对象内的任何类型值。您正在显式存储T先前已删除的类型信息。

[关于这实际上是关于类而不是类型的评论中的有用讨论]

于 2021-08-19T06:11:00.823 回答