2009-06-23 81 views
29

略高於堆棧溢出的問題更具體的What is an existential type?,一些說明性的例子就是Scala的存在類型和Java的通配符之間的區別,prefereably?Scala的存在類型和Java的通配符之間的區別?

在我看到的所有東西中,它們看起來都很相當。

幾個參考。 Martin Odersky mentions them;谷歌的top hit for my question

MO:原通配符設計......是由生存型的啓發。實際上原始文件在存在類型中有一個編碼。但後來當實際最終設計在Java中走了出來,這方面迷路了一點點

+0

imho,fotNelton似乎讓其他人省略了一些相關的附加內容,這對了解更多內容會很有趣。這將是有趣的後半部分的報價解釋更清楚... – ib84 2013-04-24 17:54:24

回答

13

這是馬丁·奧德斯基對斯卡拉用戶郵件列表答案:

(由 五十嵐和Viroli在ECOOP論文中描述)的原始Java通配符類型確實爲生存 類型只是速記。我被告知,並且我已閱讀Fool '05關於Wild FJ的論文 通配符的最終版本與 存在類型有一些細微的差異。我不知道究竟是什麼意思(他們的 形式主義與經典存在主義類型相去甚遠,能夠找出差異),但也許仔細閱讀FJ論文將揭示它的一些細節。

所以它似乎是斯卡拉存在類型和Java通配符樣,相當於

6

他們應該是等價的,因爲他們的主要目的是與Java的通配符進行交互。

+0

我已經添加Martin Odersky的評論給我原來的問題。閱讀他對Bill Venners的迴應,感覺存在型不等於通配符。當然,我確信我讀了一段時間,基本上誇大了Scala *不*具有通配符類型(正如它最初沒有的那樣)是一件好事。 – 2009-06-23 15:31:56

+0

有人向我指出,這可能是誇大事實,斯卡拉不具有*原始*類型 – 2009-06-24 07:04:32

6

他們都非常相似,但Scala的存在類型應該是更強大。例如,Scala的存在類型可以是上限和下限,而Java的通配符只能上限綁定。

例如,在Scala中:

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

foo的需要參數的列表,其具有下界Int的。

4

的一種方式由馬丁·奧德斯基(其餘可以發現here)更詳細的解答:

斯卡拉需要生存類型基本上是三件事情。第一個 是我們需要對Java的通配符有所瞭解,存在類型是我們對它們的意義。第二個是我們 需要對Java的原始類型有所瞭解,因爲它們也是 仍然在庫中的未加密類型。如果你得到一個Java raw 類型,比如java.util.List,它就是一個不知道 元素類型的列表。這也可以在Scala中用一個存在的類型 來表示。最後,我們需要存在類型來解釋在Scala高層虛擬機上運行 的方法。 Scala使用泛型的擦除模型 ,就像Java一樣,所以我們在程序運行時不再看到類型參數 。我們必須進行擦除,因爲我們需要 與Java進行互操作。但是當我們做反思 或想要表達VM中發生的事情時會發生什麼?我們需要能夠通過 來表示JVM使用我們在Scala中使用的類型所做的工作,而存儲類型讓我們可以做到這一點。他們讓你談談你不知道這些類型的某些方面的類型。

0

List[_]符號(其作爲其他的答案指出的是更強大的模擬Java的List[?])是Scala一種存在類型的more general notion的簡併情況。

相關問題