【问题标题】:Can I use one variable for different containers (List, Set, Map)?我可以为不同的容器(List、Set、Map)使用一个变量吗?
【发布时间】:2014-02-17 11:59:39
【问题描述】:

需要更改容器类型:

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. 是否可以将 List 转换为 Map? 请展示代码示例。

【问题讨论】:

  • 你不能同时拥有它!如果您想为不同的集合使用通用类型,您将不得不接受您将无法调用其中一些集合不存在的方法(例如 indexOf 对 @ 没有意义987654325@).
  • [1] 如果您定义每个类的方法行为,[2] 如果您定义您希望如何转换它(奇数是键,偶数是值?)。你看,你可以有一个“一个接口规则所有”,但你必须首先指定每个方法对每个结构的含义。
  • 只使用一个变量如何“更好”。它实际上更令人困惑,因为你的代码更难推理。 “我在看哪一组?”

标签: java collections


【解决方案1】:

如果某个方法在一个接口中不存在,那么它不存在是有原因的。不要试图有一个解决方法来获得它,这通常会导致麻烦。例如,为Set 使用indexOf 方法没有任何意义接口

但是,有时从现有对象构造不同类型的新对象可能很有用,例如,如果您有一个 ArrayList 并且您不想重复,那么转换它确实有意义到HashSet

您应该选择最适合您需要的接口,如果找不到,您可以随时实现自己的类。

【讨论】:

    【解决方案2】:

    我找到了解决办法,好不好?

    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;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-08-13
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 2022-08-15
      • 2015-12-20
      相关资源
      最近更新 更多