Scala创始人致信51CTO:全面解答Scala的泛型优势

51CTO开发频道最新推荐:Scala编程语言专题

【51CTO独家特稿】Scala创始人Martin Odersky的访谈录在51CTO已经连续发表了一月有余,读者的反映十分热烈。访谈中,Martin介绍了很多Scala的设计理念以及语言特性,对于程序员了解Scala编程语言有着极大的帮助。然而,在很多具体的方面,限于访谈时间与篇幅的关系,Martin并没能够给予足够的解释。为此,51CTO的编辑于近日致电邮向其询问,并很快得到了来自Martin的回信。信件包括几个方面的内容,本文主要介绍有关Scala泛型方面的。

第一篇访谈中,Martin讲到了他在设计Java泛型时遇到的约束,而正是Java的约束性令Martin产生了创建一个超越Java的新语言的念头,并最终因此产生了Scala编程语言。而在之后有关Scala的类型系统部分中,Martin解释道,“Scala像Java一样,使用泛型擦除模式(erasure),所以当程序运行时,我们不再能看到类型参数。这是为了能与Java互用而进行的设计”。另外,51CTO的编辑也在其他Scala的用户那里看到这样的疑问,说“听说Scala在泛型上超越了Java,但具体是哪些方面,我也搞不清楚。”为此,邮件中的问题之一就是:

具体来说,Scala在泛型上有哪些方面比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)模式的支持。

我相信,具体化(reification)的缺乏可以通过manifests类来充分解决。Manifests类型现在在Scala中还正在设计中。具体化经常被描述成一切泛型问题的万灵药,但它不是。还有就是,拥有泛型的成功的语言中,比如Haskell,ML或OCaml中,都在使用泛型擦除模式(erasure),所以(Scala中)使用这个模式并非只是为了向Java妥协而设计。

相关推荐