2012-12-27 64 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