如果有这样的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);
这是什么交易?
答案 0 :(得分:3)
create()
接受T
作为参数,并返回Io<T>
作为返回值。
但是,在您的代码中,您将TestMessage.class
作为参数发送。
TestMessage.class
的类型为Class<TestMessage>
,而不是TestMessage
类型(它是类对象,不是TestMessage
类型的对象)。
因此,编译器“理解”T
为Class<TestMessage>
,并且Io<Class<TestMessage>>
应该是create()
的返回类型,但是您将其重新分配给{{ 1}} - 这是u
类型的变量 - 错误的类型。
答案 1 :(得分:1)
我认为您正在寻找的签名是:
public <T> Io<T> create(Class<T> type, TransportProtocol protocol) {