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

原创
开发 后端
Scala编程语言可以说是基于JVM的语言中最具有潜力的一个。在Scala创始人Martin Odersky的访谈中可以看出,泛型是他创建Scala的主要原因之一。近日,在51CTO编辑阿菜与Martin的电子邮件来往中,Martin详细揭示了Scala泛型相对于Java泛型的优越之处。

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中是不可能完成的:

  1. val xs = new Array[List[Int]](leng)  
  2. 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妥协而设计。

有关Scala的泛型就先介绍到这里。51CTO在未来将继续带来新的有关Scala编程语言的各种新消息,介绍,教程,以及各种你想知道的关于Scala的内容。对于Java开发人员而言,Scala的学习曲线可以说是微乎其微,而且潜力也相当可观。如果对Scala语言感兴趣,欢迎继续关注51CTO的Scala编程语言专题

【51CTO.COM 独家特稿,转载请注明出处及作者!】

【相关阅读】

  1. Scala的类型系统:取代复杂的通配符
  2. Scala的类型系统 比Java更灵活
  3. Java程序员,你为什么要关注Scala
  4. Scala创始人:创造比Java更好的语言
  5. Java以外的选择 Scala编程语言简介
责任编辑:yangsai 来源: 51CTO.com
相关推荐

2010-08-11 08:35:00

Scala 2.8Scala创始人Martin Oder

2009-05-20 09:41:10

2009-07-08 11:44:40

ScalaGroovyJVM

2009-09-09 14:11:58

Scala泛型

2020-02-21 08:18:58

JavaScala编程语言

2010-04-06 18:19:00

51CTO技术周刊

2023-06-19 16:44:05

数字化

2010-01-28 11:08:32

MariaDB

2010-09-14 13:22:17

Scala编程指南Scala

2011-09-08 13:50:51

51cto 51CTO

2011-09-08 13:26:27

51cto 51CTO

2010-05-10 13:00:37

华为认证

2010-12-10 13:21:47

51CTO博客大赛

2010-05-04 16:22:45

Unix系统

2010-04-19 17:03:01

搜索谷歌

2016-06-16 17:34:59

html5高招

2011-10-17 15:22:59

TechEd2011

2011-09-08 14:24:57

51cto 51CTO

2015-03-11 14:52:03

AppCan移动应用引擎AppCan移动应用引

2013-04-08 10:38:00

点赞
收藏

51CTO技术栈公众号