java接口中的抽象方法_java接口只有一个抽象方法,什么用意?

请问题主所说的书是Pierre-Yves Saumont《Functional Programming in Java: How functional techniques improve your Java programs》么?它的2.4小节是:2.4. Java 8 functional interfaces

Lambdas are used in places where a specific interface is expected. This is how Java can determine which method to call. Java doesn’t impose any constraints on naming, as may be the case in other languages. The only constraint is that the interface used must not be ambiguous, which generally means it should have only one abstract method. (In reality, it’s a bit more complex, because some methods don’t count.) Such interfaces are said to be SAM type, for single abstract method, and are called functional interfaces.

么?我一下没看出来这段原文是如何翻译出题主所引用的内容。请问题主可以指明书的具体名称信息以及附上一张引用的页的照片不?

关于SAM类型:Single Abstract Method类型是一种约定,是Java语义不愿意添加“function type”或者“delegate type”而做的妥协。

Java 8想要支持lambda expression——匿名函数表达式,“没有名字的函数”——但这玩儿总得有个类型才能用。如果Java额外添加一种叫做“函数类型”的类型,不需要指定函数的名字,只需要指定函数的参数列表类型和返回值类型即可的话,那lambda很自然地就可以跟这种类型搭配使用。

但这样的“函数类型”会是一种“structural type”,也就是说只要结构匹配就算是匹配,而Java里所有其它类型就是“nominal type”,也就是一定要名字匹配才算匹配。这样的structural type在Java里会有点格格不入,外加这样的类型最好能结合泛型来声明,但Java的泛型又暂时还不支持值类型,很尴尬。所以Java就没造出这种额外的函数类型。

那么那些lambda表达式的类型怎么办?好办啊,安个接口就好了呗。接口里方法叫什么名字没关系,只要保证这个接口只有一个方法是抽象、无实现的,那么lambda表达式的函数体就可以充当这个抽象方法的实现。就这么简单。于是SAM类型(Single Abstract Method)的约定就这么来了。

在Java lambda的设计过程中,有一段时间是说所有的SAM类型(包括只有一个抽象方法的接口以及只有一个抽象方法的抽象类)都可以当作lambda表达式的目标类型,但后面真正的规范把设计收紧了,单抽象方法的接口才算数。

Java SE 8 的标准库里有 @FunctionalInterface 注解类型来标注某些接口的意图就是作为一个SAM接口类型。它只是纯标记用,并不是lambda表达式的目标类型所必须有的注解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值