Java 泛型工厂类实例化

Java 泛型工厂类实例化,java,generics,factory-pattern,Java,Generics,Factory Pattern,如果有TCP/UDP通信工厂 public enum IoFactory { // Singleton INSTANCE; public <T> Io<T> create(T type, TransportProtocol protocol) { ... return ...; } } 但是,当我用 IoFactory factory = IoFactory.INSTANCE; Io<TestMessage> u

如果有TCP/UDP通信工厂

public enum IoFactory {
  // Singleton
  INSTANCE;

  public <T> Io<T> create(T type, TransportProtocol protocol) {
    ...
    return ...;
  }
}
但是,当我用

IoFactory factory = IoFactory.INSTANCE;     
Io<TestMessage> u = factory.create(TestMessage.class, TransportProtocol.UDP);
IoFactory=IoFactory.INSTANCE;
Io u=factory.create(TestMessage.class,TransportProtocol.UDP);
我得到一个编译错误,说正确的实例化应该是

Io<Class<TestMessage>> u = factory.create(TestMessage.class, TransportProtocol.UDP);
Io u=factory.create(TestMessage.class,TransportProtocol.UDP);
交易是什么?

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


但是,在代码中,您可以将
TestMessage.class
作为参数发送。

TestMessage.class
属于
class
类型,而不是
TestMessage
类型(它是类对象,不是
TestMessage
类型的对象)

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

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


但是,在代码中,您可以将
TestMessage.class
作为参数发送。

TestMessage.class
属于
class
类型,而不是
TestMessage
类型(它是类对象,不是
TestMessage
类型的对象)


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

我认为您要查找的签名是:

public <T> Io<T> create(Class<T> type, TransportProtocol protocol) {
公共Io创建(类类型,传输协议){

我想你要找的签名是:

public <T> Io<T> create(Class<T> type, TransportProtocol protocol) {
公共Io创建(类类型,传输协议){

TestMessage.class
属于
class
类型,而不是
TestMessage
类型(它是类对象,不是
TestMessage
类型的对象)。
TestMessage.class
属于
class
类型,而不是
TestMessage
(它是类对象,不是类型为
TestMessage
)的对象。当然是!是的,这很有意义!是的,这很有意义