【发布时间】:2012-02-08 10:23:27
【问题描述】:
我正在努力完成这项工作:
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;
}
}
问题是编译错误:
类型不匹配:无法从 MapperFactory.MyTaskMapperFactory 到 映射器工厂
在我的 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?奇怪/冗长的类名只会混淆/混淆问题和答案。 -
@his MAPPER 不是类名。 HashMap
中的T等泛型Type的名称 -
它仍然是一个类型名称。 Java 中所有的大写都是常量。
-
@his - 不,不是,没关系......惯例是只使用单个字母,如 BalusC 所述stackoverflow.com/questions/2900881/…,所以我更改了我的代码以遵循惯例。
标签: java generics design-patterns abstract-factory