Java에서 클래스가 동일한 이름을 가진 메소드를 정의하는 다중 인터페이스를 구현하는 경우 서명하면 질문이 생깁니다. 어떤 방법이 재정의됩니까?
JLS(Java 언어 사양)에 따라 컴파일러는 다음 규칙에 따라 재정의할 메서드를 결정합니다.
< p>여러 인터페이스에서 상속된 메서드는 동일한 서명이 있는 경우 "재정의와 동등한"(JLS 8.4.8.4) 것으로 간주됩니다. 따라서 하나의 메소드 구현만 필요합니다.
예:
<사전>public 클래스 테스트 Implements A, B {
public static void main(String... args) throws Exception{
}
@Override
public int f() { // 인터페이스 A 또는 B
return 0;
}
}
< ;/pre>
이 코드에서 Test 클래스는 인터페이스 A와 B를 구현합니다. 두 인터페이스 모두 동일한 시그니처를 사용하는 f()라는 메서드입니다. 이러한 메서드는 재정의와 동일하므로 어떤 인터페이스의 f() 메서드가 Test.f()에 의해 재정의되는지는 중요하지 않습니다. 구현은 하나만 필요하며 컴파일러는 두 인터페이스를 구별하지 않습니다.
이 동작은 상속 및 메서드 숨기기까지 확장됩니다. 인터페이스 메서드가 슈퍼클래스나 다른 인터페이스의 메서드와 충돌하는 경우 코드가 유효하려면 충돌하는 메서드가 재정의와 동일해야 합니다.
호환성 예 :
<사전>
공개 인터페이스 선물 { 무효 현재(); }
공개 인터페이스 Guest { void 현재(); }
public class Presentable Implements Gift, Guest {
@Override
public void 현재() {
System.out.println("Heeeereee's Johnny!!!");
}
}
여기서 Gift와 Guest 모두 presents() 메소드가 있습니다. Presentable 클래스는 두 인터페이스를 모두 구현하고 현재()에 대한 단일 구현을 제공합니다. 컴파일러는 이러한 메서드가 재정의와 동일하며 별도의 구현이 필요하지 않다는 것을 인식합니다.
비호환성 예:
공개 인터페이스 Gift { void 현재(); }<br>공개 인터페이스 Guest { 부울 현재(); }</p><p>public class Presentable Implements Gift, Guest { // 컴파일되지 않습니다!!!<br> // 오류: Gift와 Guest 유형이 호환되지 않습니다<br>}<br>
이 경우 현재() 메서드의 반환 유형이 다릅니다. JLS 8.4.8.3에 따르면 재정의 메서드에는 호환 가능한 서명과 반환 유형이 있어야 합니다. Gift.present() 및 Guest.present()에는 호환되는 반환 유형이 없으므로 코드가 컴파일되지 않습니다.
요약하자면, 동일한 메소드 서명으로 여러 인터페이스를 구현할 때 컴파일러는 다음을 수행합니다. 재정의할 메서드를 재정의와 동등한 메서드로 식별합니다. 이는 어떤 인터페이스가 메소드를 정의하는지에 관계없이 하나의 메소드 구현만 필요하다는 것을 의미합니다.
위 내용은 Java는 동일한 메소드 서명을 사용하여 다중 인터페이스를 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!