Что означает "произвольный объект определенного типа" в java 8?

В Java 8 есть функция "Ссылка на метод". Одним из таких видов является "Ссылка на метод экземпляра произвольного объекта определенного типа"

http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html#type

Может кто-нибудь объяснить, что означает "произвольный объект определенного типа" в этом контексте?

Ответ 1

Это ссылка на метод экземпляра из некоторого типа. В случае примера compareToIgnoreCase - это метод из String. Программа знает, что он может вызывать этот метод в экземпляре String, поэтому он может взять ссылку и любой объект этого типа и гарантировать, что метод существует.

Я бы сравнил это с классом Method в том, что они ссылаются на метод и могут быть вызваны на произвольном экземпляре некоторого типа.

В этом примере он может использовать два объекта String и вызывать compareToIngoreCase на одном, а другой - в качестве аргумента для соответствия сигнатуре метода. Это позволяет ему принимать массив и сортировать его на основе любого метода типа массива вместо того, чтобы вместо этого требовать экземпляр компаратора.

И вот пример для тех, кто не нажимал на ссылку в вопросе:

String[] stringArray = { "Barbara", "James", "Mary", "John",
"Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareToIgnoreCase);

Ответ 2

Пример, приведенный в соединении Oracle Doc:

String[] stringArray = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareToIgnoreCase);

Лямбда-эквивалент

 String::compareToIgnoreCase

будет

(String a, String b) -> a.compareToIgnoreCase(b)

Метод Arrays.sort() ищет компаратора в качестве второго аргумента (в этом примере). Передача String::compareToIgnoreCase создает компаратор с a.compareToIgnoreCase(b) как тело метода сравнения. Затем вы хорошо спросите, что a и b. Первый аргумент метода сравнения становится a, а второй b. Это произвольные объекты типа String (конкретный тип).

Не понимаете?

  • Убедитесь, что вы знаете , что такое компаратор и как его реализовать.
  • Знайте, что такое функциональный интерфейс и как он влияет на lambdas в Java.
  • Компонент - это функциональный интерфейс, поэтому ссылка метода становится телом метода сравнения внутри объекта-компаратора.
  • Прочитайте источник ниже для другого примера в нижней части страницы.

Подробнее об источнике: http://moandjiezana.com/blog/2014/understanding-method-references/

Ответ 3

В этом случае существует массив объектов определенного типа (String), и любой случайный объект в массиве может вызвать его метод экземпляра. Этот подход позволяет классу ссылаться на свой метод экземпляра, как если бы он был статическим методом.

Также этот подход работает только для встроенного класса java, такого как String, но не для пользовательского класса. В случае определенного пользователем класса метод экземпляра может быть передан только его объекту.