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

StackOverflow https://stackoverflow.com/questions/1031042

Вопрос

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

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

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

  

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

Это было полезно?

Решение

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

  

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

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

Другие советы

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

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

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

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

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

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

  

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top