通用工厂类实例化

时间:2012-12-27 12:37:14

标签: java generics factory-pattern

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

public enum IoFactory {
  // Singleton
  INSTANCE;

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

创建Io接口:

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);
这是什么交易?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

我认为您正在寻找的签名是:

public <T> Io<T> create(Class<T> type, TransportProtocol protocol) {