2012-10-25 2 views
3

이 작업을 수행하는 방법을 알았지 만 예기치 않은 동작이 발생하고 있으므로 분명히 누락되었습니다. 여기에 문제가 있습니다.추상적 인 메서드를 서명의 제네릭으로 올바르게 재정의하는 방법

기본 클래스 :

public abstract class Base<T> 
{ 
    abstract public void foo(List<? extends T> l); 
} 

파생 클래스 :

public class Derived<T> extends Base 
{ 
    @Override 
    public void foo(List<? extends T> l) { return; } 
} 

기본 클래스 잘 준수하지만 파생 클래스를 컴파일 할 때 내가 얻을 :

Derived.java를 : 3 : 파생 클래스는 추상 클래스가 아니며 기본 클래스 foo (java.util.List)의 추상 메서드를 재정의하지 않습니다.

파생 (210 개)

공용 클래스는 자료를 확장
^
Derived.java:5 :

@Override 
^ 

이 오류

매개 변수의 제네릭을 무시하거나 슈퍼에서 메소드를 구현하지 않는 방법 List<? extends T>이 문제의 원인 인 것으로 보입니다. 두 부분의 서명을 모두 기본 유형 int으로 바꾸면 잘 처리됩니다.

아무도 나에게 무슨 일이 일어나는지 말해 줄 수 있습니까? 당신은 또한 당신의 클래스 선언의 형식 매개 변수를 전달할 수 있습니다

답변

8

예 :

public class Derived extends Base<SomeConcreteType> { 

     @Override 
     public void foo(List<SomeConcreteType> l) { 
      // ... 
     } 
    } 

ab의 일반 부분이 더 이상 필요하지 않은 경우 파생 클래스에서 구체적인 유형을 사용하기 때문에 클래스를 stract합니다. 그렇지 않으면 다른 대답이 말한 것을해야합니다.

+0

와우, 그런 간단한 해결책. 제네릭의 유형을 지정하는 것을 잊었을 때 complier 경고에 익숙해졌지만,이 경우에는 하나도주지 않습니다. –

1

당신은 그렇지 않으면 당신은 단순히 제네릭 iewithout List를 선언 메서드를 재정의해야합니다 Base에 대한 <T>를 지정해야합니다

public class Derived<T> extends Base<T> 

해야

관련 문제