2014-02-16 35 views
1

有必要改變容器類型:我可以使用一個變量用於不同的容器(List,Set,Map)嗎?

import java.util.*; 

public class MyContainers { 

    public static void main(String[] args) { 
     List<String> list = new ArrayList<String>(); 
     list.add("title1"); 
     list.add("title2"); 
     System.out.println(list.indexOf("title1")); 

     // change container type 
     Set<String> set = new HashSet<String>(list); 
    } 
} 

但它會更好只使用一個變量。我寫了這樣的代碼,但有一個限制(見註釋):

import java.util.*; 


public class MyContainers { 

    public static void main(String[] args) { 
     Collection<String> list = new ArrayList<String>(); 
     list.add("title1"); 
     list.add("title1"); 

     System.out.println(list); 

     // Can't call indexOf because there are no such method in inteface Collection 
     //System.out.println(list.indexOf("title1")); 

     // change container type 
     list = new HashSet<String>(list); 
     System.out.println(list); 

    } 
} 

請幫我這樣的問題:

  1. 是否有可能使用一個變量不同的容器,並使用全套容器方法?
  2. 是否有可能將列表轉換爲Map? 請顯示一個代碼示例。
+1

你不能擁有它!如果你想爲不同的集合使用一個通用的類型,你必須接受,你將無法調用某些集合中不存在的方法(例如'indexOf'對於' Set')。 –

+0

[1]如果您定義每個類的方法行爲,並且[2]如果您定義了期望如何轉換它(奇數是關鍵,偶數是值?)。你看,你可以有一個「一個界面統治他們全部」,但你必須首先指定每種方法對每個結構的含義。 – Leo

+0

如何只使用一個變量「更好」。這實際上更令人困惑,因爲更難推理你的代碼。 「我在看哪一套?」 –

回答

4

如果某種方法不存在於一個接口,它不存在的原因。不要試圖採取解決方法,否則通常會導致麻煩。例如,它沒有任何意義,具有對Set接口indexOf方法。

但是,有時候可以用一個現有的新類型構造一個不同類型的對象,例如,如果你有一個ArrayList而你不想有重複的東西,那麼將它轉換爲HashSet

您應該選擇最適合您的需求的界面,如果您找不到任何,您可以隨時實施自己的班級。

0

我找到了解決辦法,豈不是好?

import java.util.*; 

public class MyContainers { 

    static Collection<String> collection = new ArrayList<String>(); 

    public static void main(String[] args) { 
     collection.add("title1"); 
     collection.add("title1"); 

     System.out.println(collection); // [title1, title1] 
     useIndexOf(); 
     System.out.println(collection); // [title1, title1] 
     deleteDublication(); 
     System.out.println(collection); // [title1] 
    } 

    public static void useIndexOf() 
    { 
     List<String> list = new ArrayList<String>(collection); 
     System.out.println(list.indexOf("title1")); // 0 
     // Change container type back to universal 
     collection = list; 
    } 

    public static void deleteDublication() { 
     Set<String> set = new HashSet<String>(collection); 
     collection = set; 
    } 

} 
相關問題