나는 다음과 같은 인터페이스 Worker
이 ,자바 제네릭 인수 불일치
public class ConcreteWorker<T extends Task> extends AbstractWorker<T> {
@Override
public void doAllTasks(List<? extends T> tasks) {
....
}
}
주의는 A의 Task
클래스 정의 정의? 그것은 인터페이스입니다. SpecialTask
은 Task
인터페이스를 구현하는 구체적인 클래스입니다. 이 구조가되면 지금, 나는 아래처럼 내 주요 응용 프로그램이 클래스를 사용하려면 :
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
것을 알고하지 않습니다 -
'AbstractWorker SpecialTask>를 더 잘 확장 할 수 있습니까? –
필자는 게시 된 질문을 다시 한 번 읽는 것이 끝나기도 전에도 인간 답게 대답을 쓸 수 없습니다. 이제 누가 "존 쥐킷"인지 알 겠어! – hashbrown
어쨌든, 나의 후속 질문은 - myWorker를 호출 할 때 myWorker가 처리 할 유형을 알 수있는 방법이 없습니다 ... 'SpecialTask' 또는'SomeOtherTask'를 처리 할 것인가가 결정됩니다 후에. 그래서'myWorker'를 선언하고 늦게 초기화하려면 무엇을해야합니까? – hashbrown