Разница между экзистенциальными типами Scala и подстановочным символом Java на примере?

Немного более конкретный вопрос, чем вопрос переполнения стека Что такое экзистенциальный тип? Какая разница между экзистенциальными типами Scala и подстановочным символом Java, желательно с каким-то наглядным примером?

Во всем, что я видел до сих пор, они кажутся довольно эквивалентными.

Несколько ссылок. Мартин Одерский упоминает их; Топ-лист Google за мой вопрос:

МО: Оригинальный шаблонный дизайн... был вдохновлен экзистенциальными типами. Фактически оригинальная статья имела кодировку в экзистенциальных типах. Но потом, когда окончательный дизайн вышел на Java, эта связь немного потерялась

5 ответов

Решение

Это ответ Мартина Одерского в списке рассылки пользователей Scala:

Исходные типы символов подстановки Java (как описано в документе ECOOP Игараси и Вироли) действительно были просто краткими сокращениями для экзистенциальных типов. Мне сказали, и я прочитал в FOOL '05 о Wild FJ, что окончательная версия подстановочных знаков имеет некоторые тонкие различия с экзистенциальными типами. Я не знаю точно, в каком смысле (их формализм слишком далек от классических экзистенциальных типов, чтобы иметь возможность точно определить разницу), но, возможно, внимательное прочтение статьи Wild FJ пролило бы на нее некоторый свет.

Так что кажется, что экзистенциальные типы Scala и подстановочные знаки Java являются своего рода эквивалентными

Предполагается, что они эквивалентны, поскольку их основная цель - взаимодействие с подстановочными знаками Java.

Способ более подробного ответа Мартина Одерского (остальное можно найти здесь):

Scala нужны экзистенциальные типы по существу для трех вещей. Во-первых, нам нужно разобраться с подстановочными знаками Java, а экзистенциальные типы - это то, что мы о них думаем. Во-вторых, нам нужно разобраться с необработанными типами Java, потому что они также все еще находятся в библиотеках, не генерируемых типах. Если вы получаете необработанный тип Java, такой как java.util.List, это список, в котором вы не знаете тип элемента. Это также может быть представлено в Scala экзистенциальным типом. Наконец, нам нужны экзистенциальные типы как способ объяснить, что происходит в виртуальной машине на высоком уровне Scala. Scala использует универсальную модель стирания, как и Java, поэтому мы больше не видим параметры типа при запуске программ. Мы должны сделать стирание, потому что нам нужно взаимодействовать с Java. Но что происходит, когда мы размышляем или хотим выразить то, что происходит в ВМ? Нам нужно представить, что делает JVM, используя типы, которые есть в Scala, и экзистенциальные типы позволяют нам это делать. Они позволяют вам говорить о типах, когда вы не знаете определенных аспектов этих типов.

Они очень похожи, но экзистенциальный тип Scala должен быть более мощным. Например, экзистенциальный тип Scala может быть как верхним, так и нижним ограниченным, тогда как подстановочный знак Java может быть только верхним.

Например, в Scala:

scala> def foo(x : List[_ >: Int]) = x
foo: (x: List[_ >: Int])List[Any]

foo принимает список параметров с нижней границей Int.

List[_] нотация (которая, как указывают другие ответы, является более мощным аналогом Java List[?]) является вырожденным случаем более общего понятия экзистенциального типа в Scala.

Другие вопросы по тегам