使用接口(由多个类实现)作为类型的方法参考

时间:2016-10-10 05:29:45

标签: java interface method-reference

public interface Intf {
int size();
}

public class Cls1 implements Intf {
public int size() {
// implementation 1
}

public class Cls2 implements Intf {
public int size() {
// implementation 2
}

现在,上面两个实现中的哪一个将参考以下方法参考?

Intf::size // note: using Intf

编译器在什么基础上会在上面两个之间做出选择?或者此方法引用是否会引发异常?

2 个答案:

答案 0 :(得分:0)

多态性一般工作的正常方式。

也就是说,如果你有一个intf1 someObject,就可以调用someObject.instanceMethodName()并且它有效。

方法引用与任何其他类型的方法调用没有什么不同。

答案 1 :(得分:0)

如果您描述的话,将不会有任何实现选择(这是一件好事,编译器和解释器都无法做出决定),因为

是可以理解的类型
Intf::size

实际上是

Function<? extends Intf, Integer>

ObjToIntFunction<? extends Intf> // considering that return type is primitive int

这意味着您创建的lambda接受可分配给Intf类型的单个实例并返回整数。

现在,如果你说

new Cls1()::size

然后您将生成IntSupplierSupplier<Integer>,以较适合的为准。供应商是不接受争论的方法,要求您自己进行实施选择。