Ho difficoltà a fare questo lavoro:generici Java emissione Abstract Factory
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;
}
}
Il problema è un errore di compilazione:
Type mismatch: cannot convert from MapperFactory.MyTaskMapperFactory to MapperFactory
nel mio MapperFactory qui:
if (msgIn.isMyMapper())
return new MyTaskMapperFactory();
Qualsiasi idee su come risolvere questo errore?
Naturalmente la sostituzione:
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!");
}
avrebbe funzionato, ma che non è la risposta che sto cercando.
Questo sembra essere un problema con il modello generico di una fabbrica astratta in generale. Anche le risposte che forniscono esempi di origine usando oggetti personalizzati sono benvenute.
'MAPPER' non è un nome di classe valido in seguito alle convenzioni Java. –
Si prega di rendere i nomi delle classi il più piccoli possibile (ma ancora chiaro). E rinominare 'MAPPER' in' Mapper'? I nomi di classi strane/lunghe semplicemente confondono/ingombrano la domanda * e * le risposte. – Bohemian
@Questo MAPPER non è un nome di classe. È il nome di Tipo generico come T in HashMap –