java - 通用工厂类实例化

标签 java generics factory-pattern

如果有这样的 TCP/UDP 通信工厂

public enum IoFactory {
  // Singleton
  INSTANCE;

  public <T> Io<T> create(T type, TransportProtocol protocol) {
    ...
    return ...;
  }
}

创建Io接口(interface):

public interface Io<T> {
  public void send(T msg);
  public T receive();
}

但是,当我使用

创建 Io 实例时
IoFactory factory = IoFactory.INSTANCE;     
Io<TestMessage> u = factory.create(TestMessage.class, TransportProtocol.UDP);

我收到一个编译错误,指出正确的实例化应该是

Io<Class<TestMessage>> u = factory.create(TestMessage.class, TransportProtocol.UDP);

这是怎么回事?

最佳答案

create()接受T ,作为参数并返回 Io<T>作为返回值。

但是,在您的代码中,您发送 TestMessage.class作为参数。
TestMessage.class类型为Class<TestMessage> ,而不是 TestMessage 类型(它是类对象,而不是 TestMessage 类型的对象)。

因此,编译器“理解” TClass<TestMessage> ,并期望Io<Class<TestMessage>>应该是 create() 的返回类型,但您随后将其重新分配给 u - 这是 Io<TestMessage> 类型的变量- 类型错误。

关于java - 通用工厂类实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14054836/

相关文章:

java - Kafka能否用作分布式工作队列

typescript - 是否可以在 TypeScript 中使用模板文字生成字符串文字组合?

java - 通用接口(interface)与每种类型的接口(interface)

java - 当定义为泛型类参数时,如何获取 Enum 的 valueOf 和值并调用其实现的接口(interface)上的方法

ruby - 在实例化时将类转换为子类

namespaces - 为什么 php 动态对象类创建不起作用?

java - 如何创建类的实例而不调用其任何构造函数的代码?

java - 如何在不创建新进程的情况下通过代码运行 java 命令?

java - DocumentBuilderFactory#newInstance() 如何成为抽象工厂模式的一个例子?

java - 如何在我的 vaadin 应用程序中添加面包屑?