泛型(Generics)

泛型(Generics)

我相信,具體化(reification)的缺乏可以通過manifests類來充分解決。Manifests類型現在在Scala中還正在設計中。具體化經常被描述成一切泛型問題的萬靈藥,但它不是。還有就是,擁有泛型的成功的語言中,比如 Haskell,ML 或 OCaml 中,都在使用泛型擦除模式(erasure),所以(Scala中)使用這個模式並非只是為了向 Java 妥協而設計。- Martin Odersky


  1. Scala 的 Array 優於 Java 可使用泛型化參數與類型變數
    1. Array[String](10)
    2. Array[T](10)




Scala在泛型上超越了Java, http://developer.51cto.com/art/200906/128037.htm
Martin道,「Scala像Java一樣,使用泛型擦除模式(erasure),所以當程序運行時,我們不再能看到類型參數。這是為了能與Java互用而進行的設計」。


以下是Martin Odersky的回答:

首先是Arrays。Scala中的array可以取泛型參數(parameterized types)以及類型變量(type variables)來做其元素的類型。這兩項在Scala中是可能的,但在Java中是不可能完成的:

val xs = new Array[List[Int]](leng)
val ys = new Array[T](len) // 這裡的T是類型變量


我在Java泛型中感到最煩人的缺點之一就是array泛型的缺乏。要實現array的泛型,必要的步驟就是讓array變成非變量(non-variant)。Java無法做到這一點,這是因為其向後兼容的關係。但是,Scala可以做到。

第二,對基本類型(primitive types)的支持。上面給出的兩行代碼已經顯示出基本類型可以被當做類型參數(type parameters)來使用。

第三,聲明地點可變性(declaration site variance)。對於類型協變量(types covariant)以及逆變量(contravariant)聲明的支持,將極大的改進絕大多數庫的一致性。

第四,對於上下邊界的支持(lower bound & upper bound),以及將多個上邊界(multiple upper bonds)做為復合類型(compound type)模式的支持。




Comments