почему оператор Java 8 :: не работает для метода Object hashcode, когда мы используем super? - PullRequest
0 голосов
/ 20 февраля 2019

Код работает ниже

Function fun1= super::equals
Function fun2= Object::hashCode 

Но код ниже не

Function fun1= Object::equals
Function fun2= super::hashCode 

В чем здесь заключается концепция, хотя все являются методами экземпляра в классе Object.

Я где-то читал, что принципами являются:

  1. объект :: методы экземпляра
  2. Класс :: статический метод
  3. Класс :: Метод экземпляра

Ответы [ 5 ]

0 голосов
/ 23 февраля 2019

Таким образом, чтобы подвести итог, ссылки на метод следующие:

  • super::equals эквивалентно Function<Object, Boolean> f = a -> super.equals(a).
  • Object::hashCode эквивалентно Function <Object, Integer> f = a-> Object.hashCode(a).
  • super::hashCode эквивалентно Supplier<Integer> f = () -> super.hashCode()
  • Object::equals эквивалентно BiFunction<Object, Object,Boolean> f = (a, b) -> a.equals(b).

Обратите внимание, что тип вашей переменной несовместим с лямбда-сигнатурой.

0 голосов
/ 20 февраля 2019

Когда вы пишете 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;
0 голосов
/ 20 февраля 2019

hashCode не является функцией.это поставщик.

Supplier fun2 = super::hashCode;
0 голосов
/ 20 февраля 2019

java.util.Function - это функция, которая принимает один аргумент.

super::equals - это функция, которая принимает один аргумент (объект, который является superпо сравнению с), следовательно, это работает.Object::equals - это функция, которая принимает два аргумента: целевой объект и объект для сравнения, следовательно, она не работает.

Аналогично, Object::hashCode является функцией одногоаргумент, но super::hashCode является функцией нуля аргументов.

0 голосов
/ 20 февраля 2019

Интерфейс Function - это функциональные интерфейсы, представляющие функцию, которая принимает один параметр и возвращает значение.

super::equals работает, потому что это функция, которая принимает один параметр и возвращает значение.

Object::equals не работает, потому что это функция, которая принимает два параметра и возвращает значение.

Если у вас есть ссылка на методform ClassName::instanceMethod, функция, которую она представляет, будет иметь дополнительный параметр - объект, для которого вызывается метод.Согласно документам :

Эквивалентное лямбда-выражение для ссылки на метод String::compareToIgnoreCase будет иметь список формальных параметров (String a, String b), где a и bпроизвольные имена, используемые для лучшего описания этого примера.Ссылка на метод будет вызывать метод a.compareToIgnoreCase(b)

super::equals имеет форму instance::instanceMethod, поэтому проблем нет и работает, как вы ожидаете.

Правильный функциональный интерфейстипы для Object::equals и super::hashCode - это BiFunction<Object, Object, Boolean> и IntSupplier.

Кроме того, не используйте необработанные типы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...