Что означает "произвольный объект определенного типа" в java 8?
в Java 8 есть функция "ссылка на метод". Одним из его видов является "ссылка на метод экземпляра произвольного объекта определенного типа"
http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html#type
может ли кто-нибудь объяснить, что означает "произвольный объект определенного типа" в этом контексте ?
4 ответов
это ссылка на метод экземпляра из некоторого типа. В случае, например, compareToIgnoreCase
метод с String
. Программа знает, что она может вызвать этот метод на экземпляр String
, поэтому он может взять ссылку и любой объект этого типа и гарантировать, что метод существует.
Я бы сравнил это с Method
class в том, что они ссылаются на метод и могут быть вызваны на произвольный экземпляр некоторого типа.
например, он может использовать два String
объекты и вызов compareToIgnoreCase
на одном и использовать другой в качестве аргумента, чтобы соответствовать сигнатуре метода. Это позволяет ему взять массив и отсортировать его на основе любого метода типа массива вместо того, чтобы требовать этого от экземпляра компаратора.
и вот пример для тех, кто не кликнул на ссылку в вопрос:
String[] stringArray = { "Barbara", "James", "Mary", "John",
"Patricia", "Robert", "Michael", "Linda", "George" };
Arrays.sort(stringArray, String::compareToIgnoreCase);
пример, приведенный из связанного документа Oracle:
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
. Первым аргументом для метода compare становится a
и второй b
. Это произвольные объекты типа String (конкретный тип).
не понимаю?
- убедитесь, что вы знаете что такое компаратор и как его реализовать.
- знаю, что функционального интерфейса есть и как это влияет на лямбды в Java.
- A компаратор-это функциональный интерфейс вот почему ссылка на метод становится телом метода сравнения внутри компаратора объект.
- читать источник ниже для другого примера в нижней части страницы.
подробнее в источнике: http://moandjiezana.com/blog/2014/understanding-method-references/
см. ниже пример кода, в котором объясняется" ссылка на метод экземпляра произвольного объекта определенного типа", описанный вhttps://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html
import java.util.Arrays;
class Person{
String name;
//constructor
public Person(String name){
this.name = name;
}
//instance method 1
public int personInstanceMethod1(Person person){
return this.name.compareTo(person.name);
}
//instance method 2
public int personInstanceMethod2(Person person1, Person person2){
return person1.name.compareTo(person2.name);
}
}
class Test {
public static void main (String[] args) throws Exception{
Person[] personArray = {new Person("A"), new Person("B")};
// Scenario 1 : Getting compiled successfully
Arrays.sort(personArray, Person::personInstanceMethod1);
// Scenario 2 : Compile failure
Arrays.sort(personArray, Person::personInstanceMethod2);
// Scenario 3 : Getting compiled successfully.
Person personInstance = new Person("C");
Arrays.sort(personArray, personInstance::personInstanceMethod2);
// Scenario 4 : Getting compiled successfully. As the same way as "Scenario 1"
String[] stringArray = { "Barbara", "James", "Mary", "John",
"Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareToIgnoreCase);
}
}
Сценарий 1 и сценарий 4 описывают категорию "ссылка на метод экземпляра произвольного объекта определенного типа", описанную в https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html
если параметр method принимает переменную того же типа экземпляра, что и тип экземпляра элемента, можно вызвать этот метод экземпляра с помощью Type.(Person:: personInstanceMethod1)
сравнить "personInstanceMethod1" метод экземпляра в "лицо" класса с "compareToIgnoreCase" метод экземпляра в "строку" класс (https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#compareToIgnoreCase-java.lang.String-) увидеть сходство. Оба принимают один параметр с одним и тем же типом.
сравните Сценарий 1 и Сценарий 2, чтобы увидеть разницу.
в этом случае существует массив объектов определенного типа (строка), и любой случайный объект в массиве может вызвать его метод экземпляра . Этот подход позволяет классу ссылаться на свой метод экземпляра, как если бы это был статический метод .
также этот подход работает только для встроенного класса java как String, но не для пользовательского класса . В случае определяемого пользователем класса метод экземпляра может ссылаться только на его объект .