2012-12-27 41 views
0

如果有一个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); 

我收到一个汇编错误,说正确instantia应该是

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

这是怎么回事?

+1

'TestMessage.class'的类型是'类',而不是类型的'TestMessage'(它是类对象,而不是一个“TestMessage”类型的对象)。 – amit

回答

3

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

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

,编译器“理解” TClass<TestMessage>,预计Io<Class<TestMessage>>应为返回类型从create(),但你其重新分配给u - 这是Io<TestMessage>类型的变量 - 错误的类型。

1

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

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

当然是!是的,这很有意义 – Theodor