estoy luchando para hacer este trabajo:genéricos de Java cuestión abstracta de fábrica
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;
}
}
El problema es un error de compilación:
Type mismatch: cannot convert from MapperFactory.MyTaskMapperFactory to MapperFactory
en mi MapperFactory aquí:
if (msgIn.isMyMapper())
return new MyTaskMapperFactory();
Cualquier ideas de cómo solucionar este error?
Por supuesto la sustitución:
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!");
}
con:
public static MapperFactory<?> getMapperFactory(Message msgIn, Message msgOut) {
if (msgIn.isMyMapper())
return new MyTaskMapperFactory();
throw new IllegalStateException("Mapper not found!");
}
quiere trabajar, pero que no es la respuesta que yo estoy buscando.
Esto parece ser un problema con el patrón genérico de fábrica abstracta en general. También se agradecen las respuestas que proporcionan muestras de origen utilizando objetos hechos a medida.
'MAPPER' no es un buen nombre de clase siguiendo las convenciones de Java. –
Por favor, haga que los nombres de su clase sean lo más pequeños posible (pero claros). ¿Y renombrar 'MAPPER' a' Mapper'? Los nombres de clase extraños/largos simplemente confunden/complican la pregunta * y * las respuestas. – Bohemian
@his MAPPER no es un nombre de clase. Es el nombre del tipo genérico como T en HashMap –