2012-02-29 1 views
2

나는 다음과 같은 예를하려고했다 :메서드 서명이 동일하지만 일반 매개 변수가 다른 경우 메서드 오버 라이딩 작업은 어떻게됩니까?

class BaseClass { 
    public void methodA(Class<?> cl) { 
     System.out.println("Base.methodA()"); 
    } 
} 

class SubClass extends BaseClass { 
    public void methodA(Class cl) { 
     System.out.println("Sub.methodA()"); 
    } 
} 

public class OverrideEx { 

    public static void main(String[] args) { 
     BaseClass b = new BaseClass(); 
     BaseClass s = new SubClass(); 

     b.methodA(Class.class); 
     s.methodA(Class.class); 
    } 
} 

출력 : Base.methodA() Sub.methodA()

을 나는 주위를 타고 방법 인수를 통해 다른 방법을 변경한다면 다음과 같이

class BaseClass { 
    public void methodA(Class cl) { 
     System.out.println("Base.methodA()"); 
    } 
} 

class SubClass extends BaseClass { 
    public void methodA(Class<?> cl) { 
     System.out.println("Sub.methodA()"); 
    } 
} 

public class OverrideEx { 

    public static void main(String[] args) { 
     BaseClass b = new BaseClass(); 
     BaseClass s = new SubClass(); 

     b.methodA(Class.class); 
     s.methodA(Class.class); 
    } 
} 

컴파일 오류가 발생합니다. "이름 충돌 : SubClass 유형의 methodA (Class) 메소드는 BaseClass 유형의 methodA (Class)와 동일한 삭제 기능을 갖지만이를 대체하지 않습니다."

왜 그럴까요?

+2

이 답변은 http://stackoverflow.com/a/502770/1030409 – Patrick

+0

가능한 복제본 [유형 지우기, 재정의 및 제네릭] (http://stackoverflow.com/questions/502614/type-erasure- 오버라이드 및 제네릭) –

답변

2

매개 변수가있는 유형 Class<?>은 원시 형식 Class4.10.2)의 하위 유형입니다. 재기록 x있는 경우 제 1 실시 예에 대한 호출 s.methodA(x) 따라서

또한 유효한 것이다 :

((BaseClass)s).methodA(x) 

이것은 두 번째 예 사실이 아니다.

의 하위 유형이 아닌 Class 유형의 x이 있다고 상상해보십시오. 인수의 유형이 형식 매개 변수 유형의 부속 유형이 아니기 때문에 이라는 호출은 유효하지 않습니다.

즉, methodASubClass 인 것은 methodABaseClass입니다.

0

JLS에 따르면 (다른 것 중에서) 다음과 같은 경우 메서드를 재정의 할 수 있습니다. m1의 서명은 m2의 서명의 하위 서명 (§8.4.2)입니다. (JLS again) 것을 의미

- m2는 M1 또는
동일한 서명이 -
는 (M1)의 서명 m2의 서명의 소거와 동일하다.

methodA을 무시하려고 시도 할 때 동일한 유형의 삭제가 있지만 동일한 서명이 없습니다. jls의이 장에는 설명하는 문제에 대한 토론이 있습니다.