본문 바로가기

java

Interface 상속 공부 (same signature interface method)

interface 상속 시 같은 이름의 method를 가지는 경우 어떻게 처리되는지 궁금했다.

다음 코드를 컴파일 해보니, 별 문제없이 컴파일 되었다.

//T.java
public interface T {
	public void t();
}

//T2.java
public interface T2 {
	public void t();
}

//Human.java
public class Human implements T, T2 {
	@Override
	public void t() {
		System.out.println("talk!!");
	}
}

//Main.java
public class Main {
	public static void main(String[] args) {
		Human h = new Human();
		h.t();
	}
}

 

stack overflow의 답변에 따르면
위의 T.t()와 T.t2()는 Override-equivalent이기 때문에 하나의 Overriding만 필요하다고 한다.

Oracle Reference에 Override-equivalent는 다음과 같이 정의되어 있다.
"Two method signatures m1 and m2 are override-equivalent iff either m1 is a subsignature of m2 or m2 is a subsignature of m1."

subsignature는 다음과 같이 정의되어 있다.
The signature of a method m1 is a subsignature of the signature of a method m2 if either:

  • m2 has the same signature as m1, or
  • the signature of m1 is the same as the erasure (§4.6) of the signature of m2.

method 이름과 매개변수 type (순서 포함) 이 동일하다면, 두 함수는 same signatures 관계이다.

 

근데 Chap 8 Class와 Chap 9 Interface를 아무리 찾아봐도 해당 상황에 대해 허용한다는 말은 없다.
이에 대해서는 다시 공부해보고 추가해야겠다.

 

 

참고
https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html
https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.2
https://stackoverflow.com/questions/2801878/implementing-two-interfaces-in-a-class-with-same-method-which-interface-method