2011-08-05 34 views
10

我一直聽到很多關於不同的JVM語言,仍然在蒸發模式,建議以某種方式實現具體化。我有這種半記憶(或完全想象,不知道是哪一種)的嘮叨,認爲在某處我讀到Scala以某種方式利用了JVM的類型擦除來完成它不能用於物化的事情。從Scala在CLR和JVM上實現以來,對我來說這並沒有什麼意義,所以如果物化引起某種限制,它會出現在CLR實現中(除非CLR上的Scala只是忽略實體) 。對於Scala來說,有沒有類型擦除的優點?

那麼,在Scala中輸入擦除的好方面,還是具體化的好東西?

+0

如果只有最無處不在的JVM語言才適合。 :( –

+2

「除非CLR上的Scala只是忽略物化」......它的確如此。 – soc

回答

13

請參閱Ola Bini's blog。衆所周知,Java具有使用站點協變性,通過在您認爲差異適當的任何地方使用小問號來實現。 Scala具有定義站點協方差,由類設計人員實施。他說:

泛型是一個複雜的語言功能。當添加到已有 子類型的現有語言時,它變得更加複雜。這兩個功能在 一般情況下並不能很好地結合在一起,在將它們添加到 語言時必須非常小心。將它們添加到虛擬機很簡單,如果該機器只需要提供一種語言 - 並且該語言使用相同的 泛型。但是泛型沒有完成。目前還不完全瞭解 如何正確處理和取得新的突破(Scala是 的一個很好的例子)。此時,仿製藥不能被視爲 「正確完成」。不僅有一種泛型 - 它們在實現策略,特徵和角落案例中有所不同。

...

這一切都意味着,如果你想具體化泛型添加到 JVM,你應該很肯定的是,該實現可涵蓋 都希望做創新,在所有靜態語言他們自己的 版本的泛型以及所有想要創建好的實現和與Java 庫的接口設備的動態語言。因爲如果添加不符合這些標準的泛化泛型,則會扼殺創新並使其更難以使用JVM作爲多語言VM。

即如果我們在JVM中已經泛化了泛型,那麼很可能那些泛化的泛型不適合我們對Scala真正喜歡的特性,而且我們會陷入一些不太理想的地步。

+0

很好的答案,謝謝! – soc