2016-07-01 2 views
1

У меня есть следующий пример:Понимание метод ссылки

public class App { 
    public static void main(String[] args) { 
     List<Car> list = Arrays.asList(new Car("green"), new Car("blue"), new Car("white")); 
     //Ex. 1 
     List<String> carColors1 = list.stream().map(CarUtils::getCarColor).collect(Collectors.toList()); 
     //Ex. 2 
     List<String> carColors2 = list.stream().map(Car::getColor).collect(Collectors.toList()); 
    } 

    static class CarUtils { 
     static String getCarColor(Car car) { 
      return car.getColor(); 
     } 
    } 

    static class Car { 
     private String color; 

     public Car(String color) { 
      this.color = color; 
     } 

     public String getColor() { 
      return color; 
     } 
    } 
} 

Ex. 1 работает, так как метод getCarColor в классе CarUtils имеет тот же метод подписи и тип возврата, что и метод apply в формате Function.

Но почему Исх. 2 работы? Метод getColor в Car класс отличается от apply сигнатурой метода, и я ожидаю получить ошибку времени компиляции здесь.

+3

Вы можете придумать метод 'getColor' как имеющий неявный параметр' this', который передается в метод. Некоторые языки делают это явным. Таким образом, у вас в основном есть функция, которая принимает экземпляр 'Car' и возвращает' String'. –

ответ

2

Метод getColor в классе Car отличается от применяемой сигнатуры метода, и я ожидаю получить ошибку времени компиляции здесь.

Не совсем. Car.getColor() - метод экземпляра. Вы можете увидеть его как функцию, которая принимает один аргумент: this, типа Car, и возвращает строку. Так что совпадения с сигнатурой apply() в Function<Car, String>.

+0

Предположим, у меня есть метод экземпляра, который принимает два аргумента. Имеет ли он на самом деле три аргумента, и первым будет экземпляр, к которому принадлежит метод? – user1745356

+3

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

Смежные вопросы