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
编译器在什么基础上会在上面两个之间做出选择?或者此方法引用是否会引发异常?
答案 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
然后您将生成IntSupplier
或Supplier<Integer>
,以较适合的为准。供应商是不接受争论的方法,要求您自己进行实施选择。