Разница между экзистенциальными типами Scala и подстановочным символом Java на примере? - PullRequest
30 голосов
/ 23 июня 2009

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

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

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

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

Ответы [ 5 ]

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

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

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

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

6 голосов
/ 23 июня 2009

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

5 голосов
/ 02 ноября 2012

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

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

5 голосов
/ 23 июля 2012

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

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

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

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

0 голосов
/ 15 июня 2015

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

...