Java中方法引用为何可加入接口类型列表?编译疑问解析
为什么
A::new能适配I接口并成功加入List<I>? 你这个疑问其实戳中了Java 8引入函数式编程时,方法引用适配规则里一个容易被忽略的细节——咱们一步步拆解清楚:
首先,先明确两个核心前提:
- 接口
I是函数式接口:它只有一个抽象方法void methodI();,完全符合函数式接口的定义(哪怕没加@FunctionalInterface注解,只要满足单一抽象方法的条件,就会被当作函数式接口处理)。 A::new是无参构造方法的引用,它的行为等价于一个这样的方法:A createA() { return new A(); }
接下来就是关键的适配规则了:Java 8允许返回任意类型的方法引用,适配到返回值为void的函数式接口抽象方法,只要两者的参数列表完全匹配。
放到你的代码里具体来说:
- 函数式接口
I的抽象方法methodI()是无参数、返回void; - 构造方法引用
A::new是无参数、返回A类型; - 因为参数列表完全匹配,JVM会自动忽略
A::new的返回值,只执行这个构造方法(也就是创建一个A实例,但不会保留它)。
你可以把l.add(A::new);替换成等价的Lambda表达式,就更直观了:
l.add(() -> { new A(); });
这个Lambda显然能完美适配I接口,因为它的逻辑就是执行new A(),没有返回值,完全对应methodI()的签名。而A::new本质上就是这个Lambda的语法糖,所以自然能被加入List<I>。
如果实际调用l.get(0).methodI(),你会发现确实会创建一个A实例,只是这个实例没有被保存下来而已。
内容的提问来源于stack exchange,提问作者Pâris Douady
相关产品推荐
相关产品推荐

