Scala(至少在JVM上)使用type erasure来兼容Java。此feature为widely held to suck。 Fixing this would be difficult on the JVM
In contrast to the JVM situation, .NET supports reified generics. Scala's .NET implementation会使用它们吗?如果没有,可能,或者使用具体原因会出现什么问题?
答案 0 :(得分:4)
它正在进行中,小心不要破坏JVM和.NET之间的Scala语义。
我在2011年就scala-tools邮件列表问了这个问题,Miguel Garcia给出了答案,他在其中概述了大局:
一些引言:
(1)Scala.Net预览目前的功能。你已经注意到了, 擦除阶段也作为管道的一部分运行。这是一个 预览版的“功能”,必须包含“功能” 因为还没有对CLR Generics的支持(更多关于此 下面)。然而,运行JVM风格有一个很大的优势 Scala.Net中的擦除:所有依赖的Scala程序 Scala库已经可以在.Net上编译,而不是等待 为CLR Generics做好准备。那些依赖Java JDK的程序 也可以编译,但需要支持JDK API的IKVM 问题[1]。
(2)支持Scala.Net中的CLR泛型。主要动机是 支持它正在获得与现有程序集的互操作性。在 获得这种互操作性,将注意不要脱离 来自Scala语义。换句话说,任何有效的Scala程序都将继续 在JVM和.NET上运行并生成相同的结果。这带来了我们 对正在进行的工作[2]。初始原型只处理C# Scala的子集。所以现在我正在解决剩下的问题。这比工作更多 最初预期,但覆盖整个语言非常重要。
关于与.NET程序集互操作的更多评论 特殊的原生问题。是的,CLR程序集可以表达使用 “native int”(不同CPU上的不同大小),P / Invoke 由.dll等导出的C函数。 Scala.Net并不打算这样做 那种低级别的诡计。感兴趣的装配互操作性是 在“共同语言规范”的层面,即什么 通常从任何C#,VB.NET等编译器获得(“通常”即 除非使用“[DllImport]”属性和相关的C ++ - isms)。
从CLI规范引用:
---开始引用---公共语言规范(CLS) - CLS是语言设计者和框架之间的协议(即, 类库)设计师。它指定了CTS的一个子集(Common 输入System)和一组使用约定。 语言为用户提供了最强的访问权限 框架,至少实施CTS的那些部分 CLS的一部分。同样,如果框架将被广泛使用 他们公开出口的方面(例如,类,接口,方法, 和字段)仅使用属于CLS并且遵守的类型 CLS惯例。 ---结束语---
查看整个帖子:
https://groups.google.com/forum/?fromgroups#!topic/scala-tools/JDjstK1_uvM
答案 1 :(得分:3)
从this question的答案中,您可以认为在VM中保留泛型可能不是一个优势,因为它仍然会决定可以表示什么以及类型之间的关系是什么。 (更深入一点,请转到Ola Bini的original blog)。
其他例子:
Erasure似乎不仅对向后兼容性有用,而且因为动态类型语言所提供的完整的运行时类型信息是有代价的。 .NET CLR Generics的设计通过代码专业化来解决这个问题。上述案例应该在删除时明确,并且当它是一种特定缺点的语言时。
网络是如果JVM已经统一了泛型(没有类型擦除),就不可能实现Scala的类型系统...... Scala的类型系统比Java更复杂,如果JVM具有基于的泛型Java泛型,我们在Scala中仍然存在问题。另一方面,类型擦除允许编译器实现复杂类型系统,即使所有类型信息在运行时都不可用。
据我所知,Scala的.NET后端远远落后于当前的JVM实现,并且也不支持.NET的具体化泛型。
Scala 2.10甚至在实际虚拟机模型中抽象类型信息的方向进一步。 Martin Odersky在一个演示文稿中提出了新的反思/具体化互动,例如embedded in this entry(从42'18开始)。
我相信您将能够使用type-tags(替换清单)来克服模式匹配和擦除的问题。 this mailing list thread上有一点,但我不知道它在多大程度上有效。
(纯粹推测:)对于比JVM具有更少类型信息的平台而言,寻求更多抽象可能有助于后端。一个假想的JavaScript编译。