Java泛型抽象工厂问题

标签 java generics design-patterns 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;
    }

}

问题是编译错误:

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!");
    }

会起作用,但这不是我正在寻找的答案。

这似乎是一般通用抽象工厂模式的问题。 也欢迎使用自定义对象提供源样本的答案。

最佳答案

根据 Effective Java,第 2 版,第 28 项:

If a type parameter appears only once in a method declaration, replace it with a wildcard.

您的 getMapperFactory 方法仅在返回类型中使用类型参数 M。按照此建议给出以下方法签名,并且该方法可以编译:

public static MapperFactory<? extends TaskMapper<Message, ? extends Message, ? extends String>> getMapperFactory(Message msgIn, Message msgOut)

编辑:我越看代码,就越认为 MapperFactory 不应该被参数化。此处代码中未使用该参数,getTaskMapper 返回一个 TaskMapper。

关于Java泛型抽象工厂问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9191434/

相关文章:

java - 响应状态代码::404 改造 2.0

generics - 如何实现 From 将一种结果类型转换为另一种结果类型?

Java泛型转换

php - 为什么不使用工厂模式进行排序?

oop - 适配器 - 适配器模式的任何真实示例

java - 如何从代码启动java小程序?

java - 以下插入排序实现之间的区别

Java泛型。对我来说有什么好处?

Javascript:配置模式

java - 为 Java 进程提供某种签名/标识符