2013-11-24 29 views
0

我正在修改一些Java代碼,並且找到了一段代碼,這是我在幾年前爲預先通用類型的Java編寫的。在序列化後獲取Java中通用接口的類型

Basicly它是一組接口,其中基本接口是類似的東西:

public interface RandomInterface 
{ 
    void setter(Object o); 
    Object getter(); 
} 

而且還有其他幾個接口,擴展這個接口,並指派特定類型的參數和返回類型:

public interface AnotherRandomInterface extends RandomInterface 
{ 
    void setter(String s); 
    String getter(); 
} 

我想知道如果我可以用一個接口,而不是如上所述,在下面的時尚「設計地獄」:

public interface GenericInterface<T> 
{ 
    void setter(T o); 
    T getter(); 
} 

這在Java中是有效和合法的,但實現此接口的對象正在序列化並通過網絡發送給另一個Java應用程序。

問題是,接收對象的應用程序對對象有效負載的類型「沒有線索」,因爲它在接口中被定義爲通用的。反序列化後有沒有什麼方法可以提取這些信息? 如果沒有,是否有任何方法在序列化之前將其存儲在對象中 - 然後使用另一個接口中定義的方法檢索它?

+0

如果你知道它的類型,就投它吧。 –

+0

是的,通過一切手段使用通用接口。是的是的。 Java是靜態類型的。在反序列化結束時,如果編譯器很高興,那麼演員將爲你完成。如果出現警告*和*,您可以說服自己該物體是安全類型的,那麼您只需自己施放並禁止警告。順便說一下,在使用基因組化和非基因化接口之間發生的事情實際上沒有什麼區別。最主要的是編譯器試圖幫助你保持類型的安全性。 – scottb

+0

@SotiriosDelimanolis我不知道類型,因爲有多個對象實現接口,使用不同類型,並且所有傳入對象的「解析」都由一個對象完成。 –

回答

1

在Java中,泛型是使用「type erasure」實現的。這意味着在運行時(包括序列化/反序列化),通用參數T的實際值不可用。所以不,你不知道這個接口使用了哪個版本。

也許如果實現此接口的具體類包含類型爲T的實際對象,那麼您可以使用它來確定反序列化後的T