객체 지향 프로그래밍 영역에서 클래스는 다중 인터페이스를 구현할 수 있습니다. 그러나 이러한 인터페이스가 동일한 시그니처를 가진 메서드를 소유하는 경우 다음과 같은 질문이 발생합니다. 컴파일러는 어떤 인터페이스 메서드가 재정의되었는지 어떻게 확인합니까?
Java에서 이러한 중첩 메서드가 있는 여러 인터페이스를 구현하는 클래스는 하나의 효과적인 구현만 갖게 됩니다. . 컴파일러는 인터페이스 출처에 따라 메서드를 구분하지 않습니다.
이 개념을 이해하기 위해 다음 예를 고려해 보겠습니다.
interface A { int f(); } interface B { int f(); } class Test implements A, B { @Override public int f() { return 0; } }
이 시나리오에서 Test는 A와 B를 모두 구현합니다. , 두 인터페이스 모두 동일한 시그니처를 사용하여 f()라는 메서드를 정의합니다. Test에서 이 메서드를 재정의하면 @Override 주석이 하나만 존재하더라도 클래스는 두 인터페이스 모두에서 f() 메서드를 효과적으로 재정의합니다.
이는 Java의 상속 규칙에 따라 서명이 동일한 메서드가 고려되기 때문입니다. "재정의와 동일합니다." 결과적으로 컴파일러는 인터페이스 원본에 관계없이 처음으로 만나는 재정의 메서드를 선택합니다.
또한 충돌하는 메서드의 반환 유형이 다른 경우 비호환성이 발생할 수 있습니다. 이러한 경우 동일한 클래스에서 동일한 시그니처를 사용하지만 반환 유형이 다른 두 메서드를 가질 수 없기 때문에 컴파일러는 오류를 보고합니다.
이 점을 설명하기 위해 다음과 같이 예제를 수정해 보겠습니다.
interface Gift { void present(); } interface Guest { boolean present(); } class Presentable implements Gift, Guest { @Override public void present() { System.out.println("Present as a gift!"); } }
여기서 Gift.present() 및 Guest.present()에는 호환되지 않는 반환 유형(void 대 boolean)이 있습니다. 결과적으로 Presentable은 재정의 규칙을 위반하므로 두 인터페이스를 모두 구현할 수 없습니다.
결론적으로, 클래스가 재정의에 해당하는 메서드로 여러 인터페이스를 구현할 때 컴파일러는 구현할 메서드가 하나만 있다는 것을 인식하고, 재정의 메서드의 @Override 주석은 모든 인터페이스에 적용됩니다. 그러나 메소드 시그니처 간의 비호환성으로 인해 컴파일 오류가 발생합니다.
위 내용은 Java는 다중 인터페이스에서 메서드를 재정의할 때 모호성을 어떻게 해결합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!