Scala дженерики по сравнению с C # - PullRequest
8 голосов
/ 15 июня 2009

Мне просто интересно узнать о деталях реализации обобщений Scala. В C # можно объявить класс как:

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

В Scala, однако, то же самое должно быть объявлено как

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

Обратите внимание, как принудительно изменяется имя класса для нескольких общих параметров. Есть ли причина, по которой Scala решил пойти по этому пути, а не по C #, который я считаю более элегантным? Я знаю, что это, вероятно, довольно маленькая придирка, но мне довольно любопытно, что касается рассуждений.

Ответы [ 3 ]

24 голосов
/ 16 июня 2009

Я знаю, что ответ Джона Скита принят, но он не совсем правильный. Ограничение накладывает не столько JVM, сколько язык Java. Цель Scala состоит в том, чтобы быть настолько легко вызываемым из Java, насколько это возможно, а в Java нет концепции перегрузки имени класса на основе параметров типа arity. Например, простой способ реализовать перегрузку, основанную на параметрах типа в JVM, был бы с искажением имен. Однако это искажение имени должно было быть видимым для Java и было бы ужасно. В вашем примере, гипотетическая Scala может скомпилировать два класса, Foo_ $ 1 и Foo_ $ 2. Скала может сделать это искажение невидимым. Однако программист на Java мог бы увидеть все это безобразие.

4 голосов
/ 15 июня 2009

Это может быть отчасти связано с аналогичными ограничениями Java. Насколько я понимаю, Scala в основном используется в JVM, где вы не можете перегрузить универсальные типы по арности.

Похоже, Scala использует стирание типа также для своих обобщений, даже в .NET-порте. (В той же статье упоминается, что у Scala были дженерики задолго до того, как в действительности появилась Java, поэтому даже если бы Java поддерживала это , это не гарантировало бы, что Scala это сделало - они были несколько ограничены, когда впервые разработали эту функцию.) *

2 голосов
/ 15 июня 2009

Полагаю, это сделано для упрощения сопоставления с Java, которое имеет такое же ограничение.

Было бы возможно сделать какое-то искажение имени, но ценой усложнения взаимодействия с Java. На мой взгляд, они приняли правильное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...