创建并处理泛型类型列表

时间:2013-07-04 12:12:14

标签: java generics

我有一个值列表,我需要在运行时存储任何类型(主要是int,double,date,...)。后来我需要处理这些。我应该怎样处理这个问题?

这是我提出的,它似乎有效,但我不确定这是否是解决此问题的正确方法。

    ArrayList<Object> list = new ArrayList<Object>();

    list.add("hello");
    list.add(1);
    list.add(0.5);

    for (int i = 0; i < list.size(); i++)
    {
        Object obj = list.get(i);

        if (obj instanceof Integer)
        {
            System.out.println((double)obj);
        }
        else if (obj instanceof String)
        {
            System.out.println(obj.toString());
        }
        else
        {
            System.out.println("Unable to deal with type.");
        }
    }

4 个答案:

答案 0 :(得分:4)

我意识到你的例子可能已经简化了,但我会为他们所有人介绍一个包装器来表示你们世界中他们之间的共同点。这是一个例子:

interface PrintableThing {
   string specialToString();
}

class IntPrintable implements PrintableThing {
    private final int int_;

    public IntPrintable(int a) { int_ = a; }
    public specialToString() { return ((double)int_).toString(); }
}

等等。现在,您可以遍历ArrayList<PrintableThing>列表,并要求每个元素执行specialToString方法。

答案 1 :(得分:2)

我能想到的两种方式:

  1. 如您提供的代码所示,在else-if中检查instanceof 中的每个对象。

  2. 使用一组您将应用于对象的方法创建一个抽象类(或接口),例如toString()(在许多情况下 - 已经按照您希望的方式实施)。

答案 2 :(得分:0)

另外,您可以创建一个自定义javabean类来保存这些数据类型。像这样:

class data{
    private Double double1;
    private int int1;
    private String1;
}

您可以列出此类类型:

List<data> l = new List<data>();

在我看来,这对你当前的实施更有意义。

答案 3 :(得分:0)

通常,您将使用通用类型来确保Collection仅包含该元素类型。因此,没有必要说ArrayList的元素具有类型Object,因为这是正常的。

当您转换为其他类型时,请确保使用instanceof测试的类型,否则您会遇到ClassCastException。我的意思是oyur line,你将Integer的Object转换为原始double。

否则就是O.K。

一个提示,而不是使用:

for (int i = 0; i < list.size(); i++)

你可以使用

for (Object obj : list)