Я изо всех сил, чтобы сделать эту работу:Java дженериков абстрактная фабрика выпуск
public abstract class MapperFactory<M extends TaskMapper<? extends Message, ? extends Message, ? extends TaskForm>> {
public static <M extends TaskMapper<? extends Message, ? extends Message, ? extends TaskForm>> MapperFactory<M> getMapperFactory(Message msgIn, Message msgOut) {
if (msgIn.isMyMapper())
return new MyTaskMapperFactory();
throw new IllegalStateException("Mapper not found!");
}
public abstract TaskMapper<? extends Message, ? extends Message, ? extends TaskForm> getTaskMapper();
public static class MyTaskMapperFactory extends MapperFactory<MyTaskMapper> {
@Override
public TaskMapper<? extends Message, ? extends Message, ? extends TaskForm> getTaskMapper() {
return new MyTaskMapper();
}
}
}
public interface TaskMapper<I extends Message, O extends Message, F extends TaskForm> {
public F fillForm(I msgIn, O msgOut, F taskForm);
public O fillMsgOut(F taskForm);
}
public class MyTaskMapper implements TaskMapper<IncomingMessage, OutgoingMessage, MyTaskForm > {
public MyTaskForm fillForm(IncomingMessage msgIn, OutgoingMessage msgOut,
MyTaskForm taskForm) {
return null;
}
public OutgoingMessage fillMsgOut(MyTaskForm taskForm) {
return null;
}
}
Проблема есть ошибка компиляции:
Type mismatch: cannot convert from MapperFactory.MyTaskMapperFactory to MapperFactory
в моем MapperFactory здесь:
if (msgIn.isMyMapper())
return new MyTaskMapperFactory();
Любые идеи, как исправить эту ошибку?
Конечно замена:
public static <M extends TaskMapper<? extends Message, ? extends Message, ? extends TaskForm>> MapperFactory<M> getMapperFactory(Message msgIn, Message msgOut) {
if (msgIn.isMyMapper())
return new MyTaskMapperFactory();
throw new IllegalStateException("Mapper not found!");
}
с:
public static MapperFactory<?> getMapperFactory(Message msgIn, Message msgOut) {
if (msgIn.isMyMapper())
return new MyTaskMapperFactory();
throw new IllegalStateException("Mapper not found!");
}
будет работать, но это не тот ответ, который я ищу.
Это, как представляется, проблема с общим абстрактным шаблоном завода в целом. Ответы на предоставление исходных образцов с использованием настраиваемых объектов также приветствуются.
'MAPPER' не является хорошим именем класса, следующего за Java-соглашениями. –
Пожалуйста, сделайте имена своих классов как можно более маленькими (но все же четкими). И переименовать 'MAPPER' в' Mapper'? Названия странных/длинных классов просто путают/загромождают вопрос * и * ответы. – Bohemian
@his MAPPER - это не имя класса. Это имя типа Generic типа T в HashMap –