Lambda表达式是对象吗?
是的,但是有一个限制:他们是**Object**子类型的实例,但是没有必要持有唯一标识符(unique identity)。一个Lambda表达式是功能接口的一个实例,而功能接口本身是**Object**的子类型。为了更容易理解,考察下面的合法赋值语句:
Runnable r = () -> {};
Object o = r;
为更好的理解,明白在Java8实现时考虑的短期目标和长期目标是有用的。短期目标是支持集合的内部迭代,增加并行处理的兴趣。长期目标是引导Java支持更多函数式编程风格。目前仅仅支持了短期目标,但是设计者非常小心的避免将来Java中函数式编程可能出现的妥协,将来可能会像Haskell和Scala一样包含全部函数类型。
Lambda表达式是否是对象的答案是根据Lambda表达式处于Java类型系统的何处,而不是它们在某一时刻如何被实现来判断。它们是对象,这是起源于将它们实现为接口实例的基础决议,这点有好的一面也有坏的一面:
- 它使lambda表达式以相对少的忧虑融入现在的类型系统
- lambda表达式继承了**Object**的方法
要注意的是,因为lambda表达式没有必要持有唯一标识符,所以继承自Object类的equals方法不具备一致的语义。
原文