Ссылка на метод с использованием интерфейса (реализованного несколькими классами) в качестве типа

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>какой лучше подойдет. Поставщики, являющиеся методами, которые не принимают аргументов, требуют, чтобы вы сами сделали выбор реализации.

Другие вопросы по тегам