2016-01-11 74 views
-3

我編寫了下面的方法來我的ArrayList轉換成一組:方法一個ArrayList轉換成一組

public static Set<Animal> toSet(){ 
    Set<Animal> aniSet = new HashSet<Animal>(animals); 
    return aniSet; 
} 

我想這樣做,而不是:

public static Set<Animal> toSet(){ 
    return HashSet<Animal>(animals); 
} 

爲什麼我得到一個錯誤消息說它找不到變量HashSet?我需要先存儲變量嗎?

編輯:必須在我的Hashset之前添加新的。編碼讓我覺得很愚蠢:')

+9

你忘了'新'' – Eran

+4

以及'動物'必須來自某個地方的事實。 –

回答

3

有兩個問題與此代碼:

  1. 你忘了animals必須來自某個地方;我不認爲第一個例子也可以編譯;和
  2. 您在創建新的HashSet<Animal>時忘記使用new

這可能是預期的行爲:

public static <T> Set<T> toSet(Collection<? extends T> data){ 
    return new HashSet<T>(data); 
} 

然後,您可以與調用它:

ArrayList<Animal> animals = new ArrayList<>(); 
//do something with the animals list 
//... 

Set<Animal> theSet = Foo.<Animal>toSet(animals); 

用通用的靜態方法,你可以用你喜歡的任何類型的呼叫。通過使用Collection<? extends T>,您不僅限於ArrayList<T>,但您可以使用任何種類的CollectionLinkedList,HashSet,TreeSet,...)。最後,該集合的類型甚至不必是動物。您可以將ArrayList<Cat>轉換爲HashSet<Animal>

但請注意,此方法沒有太多用處:調用它並不比直接使用構造函數短得多。我看到的唯一真正的優點是,您將封裝爲其中Set<T>即將使用,因此如果您稍後改變主意爲TreeSet<T>所有調用此方法的方法將生成TreeSet<T>而不是HashSet<T>

相關問題