Ссылка на метод с использованием интерфейса (реализованного несколькими классами) в качестве типа
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 ответа
Нормальный способ, которым полиморфизм работает в целом.
То есть так же, как если у вас есть intf1 someObject
, ты можешь позвонить someObject.instanceMethodName()
и это работает.
Это не отличается для ссылок на методы, чем любой другой вид вызова метода.
Не будет выбора реализации в случае, если вы описали (и это хорошо, ни компилятор, ни интерпретатор не могут принять это решение), потому что выводимый тип
Intf::size
на самом деле
Function<? extends Intf, Integer>
или же
ObjToIntFunction<? extends Intf> // considering that return type is primitive int
Это означает, что вы создаете лямбду, которая принимает один экземпляр, назначаемый Intf
введите и возвращает целое число.
Теперь, если вы скажете
new Cls1()::size
тогда вы будете производить IntSupplier
, или же Supplier<Integer>
какой лучше подойдет. Поставщики, являющиеся методами, которые не принимают аргументов, требуют, чтобы вы сами сделали выбор реализации.