Использование ссылки на метод для вызова статических методов - PullRequest
1 голос
/ 24 апреля 2019

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

Когда canClim используется без параметра, его можно без проблем передать в forEach, хотя forEach принимает Потребителя, который должен принимать параметр? При добавлении параметра в canClim это мешает компиляции?

Однако, когда canClim объявлен как статический, он не будет компилироваться без добавления статического void canClim(Animal a) к подписи. Разве нельзя вызывать статический метод без экземпляра класса Animal, потому что он статический?

Спасибо!

import java.util.*;

class Animal {
    void canClim() {
        System.out.println("I am a climber!");
    }
}

public class MethodReferencer {
    public static void main(String[] args) {
        Animal a = new Animal();
        Animal b = new Animal();
        List<Animal> list = new ArrayList<>(Arrays.asList(a, b));
        list.forEach(Animal::canClim);

    }
}

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Если метод нестатический,

Animal::canClim
эквивалентно
animal -> animal.canClim()
или (animal) -> animal.canClim()

animal вкллевая сторона лямбды - это параметр функции потребителя, а тело справа.Так что да, вы поставляете туда потребителя.

Статические методы ведут себя немного по-другому.
Например, Integer::parseInt станет str -> Integer.parseInt(str).
В основном параметрподается на параметр метода.Поэтому в статических методах вам нужно иметь параметр, чтобы можно было использовать ссылки на методы.

0 голосов
/ 24 апреля 2019

У Consumer есть метод accept, который принимает аргумент. Статический метод без аргумента не может быть преобразован в Consumer, не так ли?

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