8

我只是想知道 Scala 泛型的实现细节。在 C# 中,可以将一个类声明为:

class Foo<T1>{}
class Foo<T1, T2>{}

然而,在 Scala 中,同样的事情必须声明为

class Foo0[T1]{}
class Foo1[T1, T2]{}

请注意如何为多个泛型参数强制更改类名。Scala 决定走这条路而不是我觉得更优雅的 C# 是否有原因?我知道这可能是一个很小的挑剔,但我很好奇其中的原因。

4

3 回答 3

25

我知道 Jon Skeet 的回答已被接受,但这并不完全正确。与其说是 JVM,不如说是 Java 语言强制限制。Scala 的设计目标是尽可能容易地从 Java 调用,而 Java 没有基于类型参数数量重载类名的概念。例如,在 JVM 上实现基于类型参数的重载的一种简单方法是使用名称修饰。但是,名称修改必须对 Java 可见,并且会很丑陋。在您的示例中,假设的 Scala 可能会编译两个类,Foo_$1 和 Foo_$2。Scala 可以使这种修改不可见。然而,Java 程序员会看到所有这些丑陋之处。

于 2009-06-15T22:05:11.023 回答
4

这很可能部分是由于 Java 的类似限制。据我了解,Scala主要在 JVM 上使用,您不能通过 arity 重载泛型类型。

看起来Scala也对其泛型使用了类型擦除,即使在 .NET 端口中也是如此。(同一篇文章提到 Scala 早在 Java 真正做到之前就有泛型,所以即使 Java确实支持这一点,也不能保证 Scala 会 - 他们在第一次设计该功能时受到了一些限制。)

于 2009-06-15T14:59:35.703 回答
2

我想这样做是为了更容易映射到具有相同限制的 Java。

可以进行一些名称修改,但代价是与 Java 的互操作更加困难。在我看来,他们做出了正确的决定。

于 2009-06-15T15:00:55.840 回答