2014-01-26 32 views
0

我有一個方便的函數,它接受各種類型的對象並以可序列化的方式轉換它們。例如,JSON狀物體被轉換成JSON:避免由擴展/實現引起的模糊方法

public static <T> String process(List<T> list) { 
    if(list instanceof JSONArray) { 
     return ((JSONArray) list).toJSONString(); 
    } 
    // stringify the list 
} 
public static String process(JSONAware object) { // array, map, value, ... 
    return object.toJSONString(); 
} 

我使用的org.json.simple庫,所以JSONArray extends ArrayList implements JSONAware。但是,這意味着,當我送一個JSONArray,我得到:

參考流程是模糊

我知道,它同樣可以去任何一種方法,這就是爲什麼我有等同的實現同時。

很明顯,我可以用一個取代任意Object類型的函數來取代這兩個函數,但是這會刪除很多我不開心的編譯時檢查。我也可以重命名其中一個函數來強制某個選擇,但這會使API複雜化。

是否有某種方法可以強制某個選擇,或者讓編譯器明白,在這些情況下調用哪個方法並不重要?

+1

Wy的你有第二個 - 你可以調用toJSONString對象 – Mark

+0

這是代碼的減少的例子上。想想它像serialize-over-http;它還存儲關於發送的對象類型的信息。我正在使用它,以便基於Web的界面可以顯示有關任意對象的信息(以及發送數據中包含的對象的類型) – Dave

回答

0

您可以添加

public static void process(JSONArray array) { 
    process((JSONAware) array); 
} 

趁其不一般的解決方案,它可以解決它在這種情況下。


在這個例子中

public class Example { 

    static class A { 

    } 

    interface B { 

    } 

    static class C extends A implements B { 

    } 

    static void process(A a) { 

    } 

    static void process(B b) { 

    } 

    static void process(C c) { 
     System.out.println("process C called"); 
    } 

    public static void main(String... ignored) { 
     process(new C()); 
    } 

打印

process C called 
+0

我已經試過這個,但它沒有工作;錯誤簡單地移動到JSONArray和List版本之間,而不是JSONAware/List版本。 – Dave

+0

@Dave我會檢查你的Java版本。我嘗試Java 7更新51. –

+0

啊,我堅持一些遺留代碼運行在6.這可能是一個固定的功能? – Dave