繁体   English   中英

具有多个泛型的 Java 泛型工厂模式

[英]Java generics Factory Pattern with multiple Generics

我正在尝试学习如何使用泛型,但是我在实现工厂模式方面遇到了困难。 我希望我的 DataFactory 接口有一个方法来返回一个扩展数据的类的对象。 我相信下面的代码会起作用,但我很难理解一些东西。 有没有办法避免在 DataFactory 接口中显式指定第二种类型? 消息扩展了 Data<String>,所以如果 T 扩展了 Data<U>,不应该已经暗示了 U 吗?

数据类:

public abstract class Data<T> {

    private final long id;
    private final T content;
    private final User sender;
    ...
}

消息类:

public class Message extends Data<String> {
    ...
}

数据工厂接口:

public interface DataFactory<T extends Data<U>, U> {
    T newInstance(U content, User sender);
}

消息工厂类:

public class MessageFactory implements DataFactory<Message, String> {

    @Override
    public Message newInstance(String content, User sender) {
        return new Message(content, sender);
    }
}

为什么我不能只写:

public class MessageFactory implements DataFactory<Message>

如果这不是一个措辞良好的问题,我很抱歉,我不确定如何表达它。 最初我不想向类本身添加类型参数,只是向方法添加类型参数,但是我在尝试使其工作时遇到了更多问题。 我什至不确定我是否正确地实施了这一点。 任何帮助,将不胜感激。

因为类型系统本身不知道,在一般情况下,您不会编写GenericData<T> extends Data<T> 在这种特定情况下,您的Message类具有用于泛型类型的特定类,但您可以提供其他没有的参数。

即使 OP 已经选择了一个答案,我还是想分享更多的相关信息,以帮助其他人来这里寻找答案。

为什么要使用泛型?

首先,我们首先需要了解使用泛型的原因是什么。 泛型类型参数为您提供了一种在不同输入中重用相同代码的方法 例如,您可以使用通用代码来处理一组字符串或一组具有相同代码的小部件。 在泛型之前,我们过去处理类似情况的方式是通过强制转换对象。 为简化起见,让我们使用 OP 示例并使Data类非抽象。

public void doSomethingWithThisInput (Object o) {
    if (o instanceof MyClass) {
        MyClass myCls = (MyClass) o;
        // do something here
    }
}

如果您在泛型之前处理过 Java Collection,您就会知道这曾经是多么痛苦。 旧方法的部分问题在于,在许多情况下,您没有在开发过程中发现转换问题。 这些案例中几乎 100% 是在运行时发现的,每个人都同意这是非常糟糕的。 对于泛型,这些对象不兼容问题是在编译时发现的。

泛型用例

您想要使用泛型的主要原因是在类中创建类似“事物”的集合。 在 Java 语言中Set可见这样的例子,包括SetListMap等。

public abstract class Data<T> {
    private T content;
    // other methods and attributes omitted;
}

使用这样的类,您可以通用地引用Data对象的内容。 数据内容实际上可以是任何内容:一个Email对象、一个File对象,或者只是一个String 显然,这里的意图是如果你有一个数据内容的集合,每个对象应该是相同的类型。 创建不同内容的集合毫无意义,而且实际上适得其反。

职业教育学院

这可能是您需要学习如何正确使用泛型的最重要的一课。 **PECS** 是代表 Producers Extend Consumers Super 的首字母缩写词。 这是什么意思? 我能给你的最佳答案可以在这里找到 [https://stackoverflow.com/questions/2723397/what-is-pecs-producer-extends-consumer-super][1]。 该链接指向此处关于 PECS 的 SO 的答案。

附加资源

Oracle Java 课程:泛型

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM