Что означает "произвольный объект определенного типа" в 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, но не для пользовательского класса . В случае определяемого пользователем класса метод экземпляра может ссылаться только на его объект .