我可以将一个变量用于不同的容器(List,Set,Map)吗?

时间:2014-02-16 12:00:09

标签: java collections

有必要更改容器类型:

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? 请显示代码示例。

2 个答案:

答案 0 :(得分:4)

如果某个接口中不存在某些方法,则由于某种原因它不存在。不要试图有一个解决方法,以获得它,这通常会导致麻烦。例如,对Set 接口采用indexOf方法没有任何意义。

但是,有时候从现有的对象构造一个不同类型的新对象会很有用,例如,如果你有一个ArrayList并且你不想有重复,那么它确实有意义。将其转换为HashSet

你应该选择最适合你需要的界面,如果你找不到,你可以随时实现自己的课程。

答案 1 :(得分: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;
    }

}