我努力使这项工作: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;
}
}
的问题是一个编译错误:
if (msgIn.isMyMapper())
return new MyTaskMapperFactory();
任何:
在我MapperFactory这里Type mismatch: cannot convert from MapperFactory.MyTaskMapperFactory to MapperFactory
想法如何解决这个错误?
当然更换作者:
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!");
}
会的工作,但是这不是我要找的答案。
这似乎是一般抽象工厂模式的问题。 使用自定义制作对象提供源样本的答案也受到欢迎。
按照Java约定,'MAPPER'不是一个好的类名。 – 2012-02-13 11:52:12
请尽可能使您的班级名称尽可能小(但仍然清晰)。并将'MAPPER'重命名为'Mapper'?奇怪/长的类名称只是混淆/混淆了问题*和*答案。 – Bohemian 2012-02-13 12:01:50
@他的MAPPER不是类名。它是泛型类型的名称,如HashMap中的T –
2012-02-13 12:06:47