2016-10-10 3 views
0
public interface Intf { 
int size(); 
} 

public class Cls1 implements Intf { 
public int size() { 
// implementation 1 
} 

public class Cls2 implements Intf { 
public int size() { 
// implementation 2 
} 

이제 위의 두 구현 중 어떤 메소드가 다음을 참조합니까?메소드 참조 A 유형으로 인터페이스 사용 (두 개 이상의 클래스로 구현)

Intf::size // note: using Intf 

컴파일러는 위의 두 가지 중에서 어떤 기준을 선택합니까? 또는이 메서드 참조가 예외를 throw합니까?

+0

왜 컴파일러는'Ints :: size'를 쓸 때'Cls1' 또는'Cls2' 두 클래스 중 하나를 선택한다고 생각합니까? 컴파일러가 임의의 구현 클래스를 선택했다고 생각한다면 왜'Cls3'이 아닌가? – Holger

답변

0

일반적으로 다형성이 정상적으로 작동하는 방식입니다.

즉, intf1 someObject이있는 경우 someObject.instanceMethodName()으로 전화를 걸면 작동합니다.

다른 메소드 호출과는 다른 메소드 참조가 있습니다.

+0

제 질문의 마지막 부분을 다시 한번 살펴보십시오. 'instanceMethodName'이 'intf1'을 구현하는 여러 클래스에 있다고 가정합니다. 따라서 메서드 참조 (intf1 만)에 언급 된 클래스 이름이 없으면 컴파일러에서 어떤 클래스를 결정할 수 있습니까? –

+0

'instanceMethodName'은 인터페이스의 메소드가 아닙니다. 그것이 인터페이스에있는 방법이라면 ... 내 대답은 여전히 ​​당신의 질문에 답합니다. 이것은 정확히 다형성이 정상적으로 작동하는 방식입니다. 인터페이스에 없다면 메서드 참조를 사용하지 않아도 할 방법이 없습니다. –

+0

확실히 그것은 인터페이스에 있지만 추상적 인 방법입니다. 그리고 그것은 여러 클래스에서 다른 구현을합니다. 다시 한번, 어느 클래스가 하나입니까? (즉, 객체를 사용하여 호출하면 아무런 문제가 없습니다.하지만 인터페이스를 사용하여 호출하고 있습니다). –

0

당신이 설명한 경우에는 구현 선택이 없을 것 (그리고, 어느 컴파일러 나 인터프리터가 결정을 내릴 수있는 좋은 일),

Intf::size 

의 때문에 inferrable 유형은 실제로

Function<? extends Intf, Integer> 
입니다

또는 수락 람다를 만들 수 있다는 것을 의미

ObjToIntFunction<? extends Intf> // considering that return type is primitive int 

단일 인스턴스는 Intf 유형에 할당 가능하며 정수를 반환합니다.

지금, 당신은

new Cls1()::size 

을 말한다면 당신은 더 적합의 중, IntSupplier, 또는 Supplier<Integer>를 생성합니다. 공급자는 인수를 허용하지 않는 방법이므로 구현 선택을 직접해야합니다.