2017-02-12 1 views
1

그러나 f (object)를 f (String) 또는 f (Integer)로 변경하면 다음 코드는 컴파일되지 않습니다. 제목에 대한 다른 게시물을 읽었지만 컴파일러가 어떤 방법을 사용해야할지 모르겠다. (새 인스턴스 A a = new B();)재정의 된 메서드가 형식 매개 변수를 지정하지 못하는 이유는 무엇입니까?

public class SampleTester { 
    public static class A { 
     public void f(int x) { System.out.print("1"); } 
     public void f(Object x) { System.out.print("2"); } 
    } 
    public static class B extends A { 
      public <T> void f(T x) { System.out.print("3"); } //compiler error 
    } 
    public static void main(String[] args) { 
     A a = new A(); 
     B b= new B(); 
     a.f(3); 
     a.f("foo"); 
     b.f(3); 
     b.f("foo"); 
    } 
} 

나는 여전히 컴파일되지 않습니다 Object t-T x를 변경하는 경우, 그래서 차이점은 무엇입니까? 게다가, 왜 그것이 A의 함수를 오버라이드하지 않는가? .

public void f(int x) 
public void f(Object x) 
public <T> void f(T x) 

문제가 있다는 것이다 (모두 클래스 B 따라서 A 연장

+0

나는 왜이 질문이 내려 졌는지 확신하지 못한다. 그것은 IMO 꽤 좋은 질문 것 같습니다. – CKing

+0

내가 downvote하지 않은 동안 분명한 질문은 "그럼 오류 메시지가 무엇입니까?" 어떤 것이 컴파일되지 않는다는 (또는 컴파일되지만 예외가 발생하는) 질문은 오류 세부 사항을 포함해야합니다. –

답변

3

A에 존재하는 모든 메소드를 상속 형 삭제 후 동일한 서명이이 B 3 개 방법이된다는 것을 의미 f(T x)은 컴파일하는 동안 유형 삭제가 진행되고 TObject으로 바뀌므로 이미 Object 인수를 취하는 메소드가 있으므로 중복 된 메소드가 생성됩니다.

이 문제를 해결하려면 Object 인수를 취하는 메서드를 제거하거나 T의 상한값을 제공하십시오. (예 그래서 T 유형 - 삭제시 Number로 대체 T extends Number)


(지금 귀하의 질문에 추가 한) 당신의 코멘트를 해결하려면 다음이 아니기 때문에 컴파일되지 않습니다

public <T> void f(Object x)public void f(Object x)에 대한 유효한 재정의 : A.

public <T> void f(Object x) 메서드는 서브 클래스에 속하므로 a.<Integer>f(null); 또는 a.<String>f(null);과 같은 슈퍼 클래스 참조를 사용하여 호출 할 수 있습니다. 런타임시 오버라이드 된 메소드는 런타임시 BUT generics가 컴파일 타임에 유형 삭제를 거치므로 컴파일시에 을 Integer 또는 String으로 대체할지 여부를 컴파일러가 알 수있는 방법이 없습니다.

그것은 당신이 A의 방법 public <T> void f(Object x)B의 방법 public void f(Object x)을 가지고 같은 방법을 반대로 아직 법적 컴파일러는 <T>를 교체해야할지 결정하는 데 필요한 모든 정보를 가지고 있기 때문이다.

+0

하지만 Tx를 Object t로 변경하면 컴파일이 어떻게 달라 집니까? 그리고 왜 A의 함수를 재정의하지 않는 이유는 무엇입니까? (형식이 지워진 후에도 모두 동일한 서명이 있습니다 – DsCpp

+0

여기서는 컴파일되지 않습니다. 메서드 시그니처에서 도 제거하지 않는 한 기본 메서드를 재정의하기 만하면됩니다 –

+0

@DsCpp 이전 설명은 일부 가정 했으므로 불완전했습니다. 레벨에 대한 이해를 높이십시오. 자세한 설명은 편집을 참조하십시오. – CKing

관련 문제