2014-12-23 3 views
2

나는 다음과 같은 인터페이스 Worker이 ,자바 제네릭 인수 불일치

public class ConcreteWorker<T extends Task> extends AbstractWorker<T> { 

    @Override 
    public void doAllTasks(List<? extends T> tasks) { 
    .... 
    } 
} 

주의는 A의 Task 클래스 정의 정의? 그것은 인터페이스입니다. SpecialTaskTask 인터페이스를 구현하는 구체적인 클래스입니다. 이 구조가되면 지금, 나는 아래처럼 내 주요 응용 프로그램이 클래스를 사용하려면 :

Class Application { 
    public AbstractWorker<? extends Task> myWorker; 

    main() { 
     .... 
     List<SpecialTask> listOfTasks = new ArrayList<SpecialTask>(); 
     myWorker = new ConcreteWorker<SpecialTask>(); 
     myWorker.doAllTasks (listOfTasks); <-------------- ERROR!!! 
    } 
} 

IDE 위의 표시 줄에 나에게 다음과 같은 오류를 보여줍니다 내가 노력하고 무엇

The method doAllTasks(List<? extends capture#3-of extends Task>) in the type 
AbstractWorker<capture#3-of extends Task> is not applicable for the 
arguments (List<SpecialTask>) 

해야 할 일은 - 내 주요 응용 프로그램에서 먼저 해당 작업자의 구체적인 버전을 인스턴스화하려는 일부 논리를 기반으로 내 작업자의 추상 버전을 먼저 선언하고 싶습니다. 내가 필요한 Task의 특정 구현이 손 전에 모른다 (그래서이 (가) SpecialTask 또는 AnotherSpecialTask 등이 될 수 - 둘 다 Task 구현 가정)

솔직히

자바에 새로운되는, 내가 어떤 머리를 만들 수 없습니다 또는 오류 메시지의 꼬리. 누군가가 나를 잘못 보여줄 수 있습니까? 즉,이 유형의 인수가 정말SpecialTask 것을 알고하지 않습니다 -

답변

0

문제는 myWorker의 유형은 단지 AbstractWorker<? extends Task> 것입니다. AbstractWorker<SomeOtherTask> 일 수 있으며 List<SpecialTask>으로 무엇을해야할지 알 수 없습니다. 당신이 오직 SpecialTask를 처리 할 수있는 노동자를 개최 myWorker을 원하는 경우에

, 당신은 사용할 수 있습니다 여전히 ConcreteWorker에 따라 아니에요

public AbstractWorker<SpecialTask> myWorker; 

하지만 는 확실히 단지 아니라고 말하는입니다 예를 들면 AbstractWorker<SomeOtherTask>.

+0

'AbstractWorker 를 더 잘 확장 할 수 있습니까? –

+0

필자는 게시 된 질문을 다시 한 번 읽는 것이 끝나기도 전에도 인간 답게 대답을 쓸 수 없습니다. 이제 누가 "존 쥐킷"인지 알 겠어! – hashbrown

+0

어쨌든, 나의 후속 질문은 - myWorker를 호출 할 때 myWorker가 처리 할 유형을 알 수있는 방법이 없습니다 ... 'SpecialTask' 또는'SomeOtherTask'를 처리 할 것인가가 결정됩니다 후에. 그래서'myWorker'를 선언하고 늦게 초기화하려면 무엇을해야합니까? – hashbrown

관련 문제