Java 使用集合对象来泛化HashMap

Java 使用集合对象来泛化HashMap,java,Java,我正在做一个小项目,将分隔文件读入列并显示它们。现在我想要一个列类,它基本上是HashMap周围的包装器,但有一个问题,在调用Columns构造函数之前,我不知道第二种泛型数据类型。构造函数采用带有数据类型参数的枚举,如下所示: private enum DataTypes{ NONE, INTEGER, STRING, DATE } 我的想法是将Column类字段创建为集合,然后在调用构造函数时对其进行初始化,如下所示: private class Column { Coll

我正在做一个小项目,将分隔文件读入列并显示它们。现在我想要一个列类,它基本上是HashMap周围的包装器,但有一个问题,在调用Columns构造函数之前,我不知道第二种泛型数据类型。构造函数采用带有数据类型参数的枚举,如下所示:

private enum DataTypes{
    NONE, INTEGER, STRING, DATE
}
我的想法是将Column类字段创建为集合,然后在调用构造函数时对其进行初始化,如下所示:

private class Column {
    Collection values;

    public Column(DataTypes type){
        determineType(type);
    }

    private void determineType(DataTypes type){

        switch(type){

        case NONE:      this.values = (Collection) new HashMap<Integer, StringBuilder>();
                        break;

        case INTEGER:   this.values = (Collection) new HashMap<Integer, Integer>();
                        break;

        case STRING:    this.values = (Collection) new HashMap<Integer, StringBuilder>();
                        break;

        case DATE:      this.values = (Collection) new HashMap<Integer, Date>();
                        break;

            }

        }
    }
私有类列{
收集值;
公共列(数据类型){
确定类型(类型);
}
私有void determineType(数据类型){
开关(类型){
案例无:this.values=(集合)new HashMap();
打破
大小写整数:this.values=(集合)new HashMap();
打破
大小写字符串:this.values=(集合)new HashMap();
打破
案例日期:this.values=(集合)new HashMap();
打破
}
}
}
我的问题是,为什么我必须将其转换为集合类型(因为eclipse强制我),这是否意味着我不能使用HashMap的任何方法

对于这样的情况,是否有更好的方法或设计模式,还有什么可以改进的?这个apraoch是否有任何问题,比如在添加值时,因为我觉得需要为每个数据类型使用重载函数才能添加值

很抱歉有这么多问题,但我在实际项目和设计方面经验不足,需要“一点”指导。(大学项目很小,有a、b、c、x、y等变量)

谢谢:)

编辑


经过一整天的搜索和问这个写得很糟糕的问题,我发现策略设计模式正是我所需要的,我将在稍后发布代码。

您可以使用通配符操作符声明HashMap

private class Column {
    HashMap<?,?> values;
私有类列{
HashMap值;
然后您可以将贴图初始化为普通贴图

 case INTEGER:   this.values = new HashMap<Integer, Integer>();
case INTEGER:this.values=new HashMap();

唯一的问题是,每次向HashMap添加内容时,都必须将HashMap强制转换为
HashMap

HashMap不会扩展集合。因此,不能将HashMap分配给Collection类型的变量

Eclipse不会强制您强制强制转换。您选择了它建议的使代码编译的方法之一,但这并不意味着代码是正确的。它将在运行时失败,因为HashMap不是集合

我很难理解这个列应该代表什么。HashMap的键和值是什么?如果你真正想要的不是HashMap,而是一个集合,那么集合的值是什么


在任何情况下,由于要存储在集合/映射中的所有类型都有一个祖先类(
Object
),您可能应该将其用作集合/映射的类型。您还应该避免存储StringBuilder。请改用String。

HashMap
不是集合,也不是从集合继承的

HashMap
的类定义是:

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
此外,由于所有case语句都声明
HashMap
,键为type
Integer
,但值为可变类型,因此可以相应地声明值
Map

Map<Integer, ?> values;
Map值;
Eclipse建议您将
HashMap
强制转换为
Collection
的原因是,这些映射不是
Collection
的后代,因此满足编译器要求的唯一方法是强制转换它们,这仍然会导致运行时错误,因为它们不是集合


通过将值声明更改为type
Map
,您不仅不再需要强制转换,而且将消除运行时错误。

您不能只做一个
Map
?因为如果我在某个地方犯了逻辑错误,并将我想要的类型作为它将要执行的值,然后我将我会坐上几个小时思考为什么我的程序会给出错误的输出:)我更喜欢马上出错。Dimi的答案就是我想要的:)是的,没错。唯一的问题是你不能在这张地图上放任何东西。所以我猜这几乎是无用的。我知道这就是为什么我要求解决问题的原因,因为我看到了这个问题……你在哪里你问了这些方法?在最后的评论中,你说,“Dimi的答案就是我想要的:)”。我只是告诉您,使用这种方法,您将无法在映射中放入任何内容。column类表示CSV文件中存储在列中的值,程序将根据分隔符分解每一行,并将值放入列中,因此我不想使用HashMap,因为我可能会在某个地方犯逻辑错误并将该值放入其中应该是不同的类型。另外,如果我想在将来实现更多功能,比如修改值,StringBuilder会更好吗?为什么应该避免使用StringBuilder?这并没有回答我的问题:映射的键应该是什么?您的Column类,就像一个集合,应该是泛型的:Column、Column等。这是错误的我需要HashMap来存储行Id和值。我以为所有集合都有这个接口或基类,我在写问题时把它放在那里是为了表达一个想法,而不是工作代码。HashMap值;是我一直在寻找的东西谢谢你asnwer这是我一直在寻找的:)你铸造这个是什么意思?@RobertMazurowski您打算如何将条目放入此映射中?这仅适用于
values.size()
等与映射中的数据类型无关的操作。您不能执行
values.pu
Map<Integer, ?> values;