Поскольку тип T разрешается везде, где используется метод. Следующее утверждение действительно:
TaskService<TaskA> s = getTaskService(o);
Так и есть:
TaskService<TaskB> s = getTaskService(o);
Итак, в методе getTaskService вы не очень много знаете о T.
Правильный способ сделать это будет:
private TaskService<? extends BaseTask> getTaskService(Order o) {
if ("atype".equals(o.type)) {
return taskAService;
} else if ("btype".equals(o.type)) {
return taskBService;
} else {
return null;
}
}
Приведенное выше назначение должно стать:
TaskService<? extends BaseTask> s = getTaskService(o);