2012-02-21 69 views
0

我給我的泛型的第一步,而且我剛剛編寫了一個泛型函數來比較兩個列表對象,這樣的Java:對編程接口,而不必實例的具體類

public static <T> List<T> diffAdded(List<T> source, List<T> dest) { 
    List<T> ret = new ArrayList<T>(); 
    for(T element: dest) { 
     if (!source.contains(element)) { 
      ret.add(element); 
     } 
    } 
    return ret; 
} 

一切工作正常,但我實例化一個ArrayList,因爲很明顯我不能實例化一個接口列表

事實是,我想回到同一類型源的對象...

你怎麼了處理這種情況?

我現在可以面對現在的方法嗎?

非常感謝

+3

「*我想返回與源*相同類型的對象」 - 爲什麼?你可以使用反射來獲得真實的'source'類型,並創建一個帶反射的實例。但爲什麼? – 2012-02-21 21:39:51

+0

我看到你的觀點,很好的回答... – opensas 2012-02-21 21:48:33

+0

我同意下面的「代碼氣味」觀察。但是,如果你真的想,你可以添加一個instanceof檢查來源和實例化它的特定類型的列表... if(dest instanceof ArrayList)dest = new ArrayList (); etc .. – John 2012-02-21 21:49:50

回答

4

的這個問題的答案是幾乎總是說:「返回相同的類型源的對象」是不是你的應用程序實際上是相關的,以及你處理事情錯誤的方法。

如果調用者需要特定的List實現,因爲他們會在上面做一個特定類型的操作,那麼他們可以做到自我複製......但如果你的方法需要List類型的任意參數,輸出會根據輸入的確切實現而在語義上發生變化,那麼這是一個巨大的代碼異味。

讓你的代碼保持原樣,如果你的方法調用者確實需要特定的實現,那麼他們可以將你的輸出複製到該實現中。

1

這裏有兩個選擇。

1:意識到接受接口作爲輸入類型的意義在於,您明確表示您不關心底層實現。此外,通過返回List<T>它表示你的調用者不應該關心底層實現。在大多數情況下,ListList,細節應該沒有關係。如果是這樣,您應該明確地返回ArrayList<T>

2:製作一串多態性調用,匹配您想要支持的每個List實現類型。

我非常認爲,第一個答案是你應該指導你的努力。

相關問題