2017-11-09 17 views
1

여기에 무슨 일이 일어나고 있으며 어떻게 이해하고 있습니까? 나는이 같은 D를 선언하는 경우 그런데이상한 무시 규칙이 어떻게 지울 수 있는지 설명 할 수 있습니까?

class C<T> { 
    T id(T x) { 
     return null; 
    } 
} 

class D extends C<String> { 
    public Integer id(Integer x) { // compiles! but T shall be String ??? 
     return 7; 
    } 
} 

    public static void main(String[] args) { 

     System.out.println(new D().id("7")); // null 
     System.out.println(new D().id(7)); // 7 

    } 

는 컴파일이 제대로 사용했는지 확인할 것 이후 컴파일러는 Object와 유형 매개 변수를 대체 Name clash: The method id(Object) of type D has the same erasure as id(T) of type C<T> but does not override it:

class D extends C<String> { 
    public Object id(Object x) { // compile error ! 
     return 7; 
    } 
} 

답변

3

실패합니다. 그래서 컴파일 한 후, 원래 클래스 D

public Object id(Object x) 

완벽하게 괜찮
public Integer id(Integer x) 

있습니다.

그러나 두 번째 예에서는 동일한 클래스에 public Object id(Object x)이라는 두 가지 버전이 있습니다.

+0

Nitpick : C의 id 메소드가 OP의 예에서 공개되지 않았습니다. (여전히 +1) –

0

@Override 주석을 사용하여 메소드가 실제로 다른 메소드를 대체하는지 확인하십시오.

첫 번째 경우에는 String을 필요로하고 다른 하나는 Integer를 기대하는 두 가지 방법이 있습니다.

두 번째 경우에는 수퍼 유형 삭제 후 이미 종료 된 것과 같은 방법을 만들었습니다.