Java 泛型工厂类实例化
如果有TCP/UDP通信工厂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
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
)的对象。当然是!是的,这很有意义!是的,这很有意义