2013-03-27 3 views
13

나는 Java 8 features에 대해 읽고 있었고 메서드 참조가 있다는 것을 알았지 만 메서드가 오버로드되었을 때 어떤 메서드를 지정하는 방법을 알지 못했습니다. 아는 사람 있나요?비어 있지 않은 인수에 대한 메소드 참조?

+0

람다 식은 기능 인터페이스의 약자이므로 메서드의 유형은 인터페이스의 메서드에서 유추 할 수 있어야합니다. –

+0

@ LeonardBrünings : 이것은 람다 표현식을 말하는 것이 아니라 메소드 참조를 지칭합니다. 람다 식은 함수의 구현입니다. 메소드 참조는 기존 클래스의 기존 메소드에 대한 참조입니다. –

+0

@LouisWasserman 내가 링크 된 기사에 따르면 방법 참조는 람다이므로 내 태그로 구현 될 것입니다. – ArtB

답변

5

:

람다 표현식은 사용할 수 있습니까? 타겟 타입은 매개 변수 적절한 유형되는

  • 방법 또는 생성자 인자. 메서드 또는 생성자가 오버로드 된 경우 표현식이 대상 유형과 일치하기 전에 일반적인 과부하 해결 메커니즘이 사용됩니다. 과부하 해결 후 기능 설명자가있는 여러 기능 메서드 또는 생성자 서명이 다른 기능 인터페이스를 수락 할 수 있습니다.이 경우 람다 식은 이어야하며 이러한 기능 인터페이스 중 하나의 형식으로 캐스트되어야합니다. ;

  • 명시 적으로 대상 유형을 제공하는 캐스트 표현식입니다. 예를 들어 :

Object o =() -> { System.out.println("hi"); };  // Illegal: could be Runnable or Callable (amongst others) 
Object o = (Runnable)() -> { System.out.println("hi"); }; // Legal because disambiguated 

그래서, 당신은 모호한 서명이있는 경우를 캐스팅해야합니다.

6

컴파일러는 메소드 서명을 기능 인터페이스와 일치시킵니다.

Integer foo(){...} 

Integer foo(Number x){...} 

Supplier<Number>   f1 = this::foo; //()->Number, matching the 1st foo 

Function<Integer, Number> f2 = this::foo; // Int->Number, matching the 2nd foo 

기본적으로 f2Integer을 수용하고 Number를 반환 할 수있는 일이며, 컴파일러는 2 foo()이 요구 사항을 충족하는지 확인할 수 있습니다. this Lambda FAQ에서

관련 문제