4.6 小结
了解 Java 的类型系统之后,我们对 Java 平台的数据类型有了清晰的全局性认识。Java 的类型系统具有如下特性。
- 名义
Java 类型的名称至关重要。Java 不允许使用其他语言支持的结构类型。
- 静态
所有 Java 变量在编译时都知道类型。
- 面向对象/命令式
Java 代码是面向对象的,所有代码都放在方法中,而方法放在类中。但是,Java 有基本类型,因此并非“一切皆对象”。
- 轻度函数式
Java 支持一些常用的函数式习语,但这只是为了给程序员提供方便,别无其他目的。
- 适度的类型推导
Java 为代码(即便是程序员新手写的代码)易读性做了优化,就算信息有重复,也倾向于明确表达意图。
- 极力向后兼容
Java 是一门主要针对商业应用的语言,所以向后兼容性和保护现有代码是关注的重点。
- 类型擦除
Java 允许使用参数化类型,但这些信息在运行时不可用。
这些年 Java 的类型系统一直在进化(尽管缓慢且谨慎),引入 lambda 表达式之后,变得和其他主流编程语言一样了。lambda 表达式和默认方法的引入是 Java 5 发布以来这个平台最大的变化,除此之外,还引入了泛型和注解等相关的革新。
默认方法是 Java 实现面向对象编程方式的重大转变,这或许是 Java 语言面世以来最大的一次转变。从 Java 8 开始,接口可以包含实现代码。这从根本上改变了 Java 的本质——以前 Java 只支持单一继承,现在则可以多重继承(只是表面上如此,其实并没有状态的多重继承)。
尽管做了这些革新,Java 的类型系统还是没有(也不打算比)Scala 和 Haskell 等语言的类型系统强大。Java 的类型系统偏向于简单、易读,为新人提供一个平缓的学习曲线。
Java 还从过去十年里出现的其他语言中获益良多。Scala 是一种静态类型语言,但通过使用类型推导,看起来很像是动态类型语言。Java 从中受到了启发,不过和其他语言的设计哲学不一样。
虽然等了好久 Java 才支持 lambda 表达式,但争论最终停歇了,Java 仍然是人们更好的选择。广大的普通 Java 程序员是否需要这些增加的功能(源于 Scala 等语言的高级且缺少名义的类型系统),以及 Java 8 的轻度函数式编程(例如,map()、filter() 和 reduce() 等)是否能满足大多数开发者的需求,还有待日后观察。这注定是一段有趣的旅程。
