Когда вы пишете super::methodName
, вы создаете ссылку на метод для определенного экземпляра класса.Следовательно, метод функционального интерфейса (которому вы назначаете ссылку на этот метод) должен ожидать того же числа параметров, что и methodName
.
Когда вы пишете ClassName::methodName
, если methodName
не являетсяСтатический метод, вы создаете ссылку на метод в произвольном экземпляре класса.Следовательно, метод функционального интерфейса (которому вы назначаете ссылку на этот метод) должен ожидать того же числа параметров, что и methodName
имеет + 1 (дополнительный параметр является экземпляром ClassName, для которого будет выполняться метод).
Function
принимает один аргумент и возвращает значение.
Следовательно, вы можете назначить ему ссылку на метод определенного экземпляра и метод с одним аргументом (как в super::equals
) или методссылка на произвольный экземпляр и метод с 0 аргументами (как в Object::hashCode
).
Однако нельзя присвоить ему ссылку на метод произвольного экземпляра и метод с одним аргументом (как в Object::equals
), поскольку для этого требуется два аргумента, а Function
ожидает только один.
Поскольку ожидается два аргумента, вы можете присвоить ссылку на этот метод для BiFunction
:
BiFunction<Object,Object,Boolean> bifunc = Object::equals;
Точно так же вы не можете присвоить ему ссылку на метод определенного экземпляра и метод с 0 аргументами (как в super::hashCode
), поскольку для этого требуется 0 аргументов, а Function
ожидает один.
Поскольку ожидается 0 аргументов, вы можете назначить ссылку на этот метод для Supplier
:
Supplier<Integer> sup = super::hashCode;