java 继承 冒号,Java中的::关键字(双冒号)

读Mpush源码时看到看到Netty启动过程有一行代码

b.channelFactory(NioServerSocketChannel::new);

看到这里疑惑了,我潜意识里认为 NioServerSocketChannel::new 与 new NioServerSocketChannel()等价。

一个是名词词性,一个是动词词性。

首先,Java8中的 :: 是提供了一种将方法作为参数的一种能力,A::b 表示的是类A中的b方法名,A a = new A(); a.b(); 表示的是执行a对象的b方法。同理A::new表示的是A的构造方法,new A() 表示执行A的构造方法,前者是名词词性,后者是动词词性。

再看 b.channelFactory 方法,需要一个 ChannelFactory 参数:

public B channelFactory(io.netty.channel.ChannelFactory extends C> channelFactory) {

return channelFactory((ChannelFactory) channelFactory);

}

NioServerSocketChannel 类从名字上也可以看出它应该是 ChannelFactory 生产出来的Channel,实际上也没有继承 ChannelFactory。

所以,把代码换成以下,显然是不对的

b.channelFactory(new NioServerSocketChannel());

一定是 NioServerSocketChannel::new 的返回值有什么特殊之处,下边一探究竟。

Object obj = NioServerSocketChannel::new;

编译不通过,提示"Object is not a functional interface"。

到这里其实就比较清楚了,Java中的Xxx::new 需要一个functional interface 来接收。

定义如下接口,

public interface TestFunction {

T test();

}

TestFunction testFunction = NioServerSocketChannel::new;

NioServerSocketChannel channel = testFunction.test();

//正确,没有再报错

实际上,ChannelFactory 就是一个 functional interface,如下:

public interface ChannelFactory extends io.netty.bootstrap.ChannelFactory {

/**

* Creates a new channel.

*/

@Override

T newChannel();

}

那什么是 functional interface 呢?

其实就是有且只有一个抽象方法的接口,这个抽象方法定义了函数参数和返回值,似乎可以理解为函数的别名? 如果在接口上增加 @FunctionalInterface 注解,编译器在编译时就会检查接口是否满足 functional interface 的条件。

因为 functional interface 只有一个方法,所以 JDK 完全可以通过接口准确匹配方法。接口+唯一的方法,就是函数的概念了。

Java中的 :: 可以引用构造方法,实例方法,静态方法,多用在stream表达式中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值