1

我有一个需要存储的值列表,在运行时可以是任何类型(主要是 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

4 回答 4

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方法。

于 2013-07-04T12:18:27.490 回答
2

我能想到的两种方法:

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

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

于 2013-07-04T12:21:33.107 回答
0

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

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

您可以列出此类类型的列表:

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

在我看来,这比您当前的实现更有意义。

于 2013-07-04T12:20:23.773 回答
0

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

并且当您转换为其他类型时,请确保使用您测试过的类型,instanceof否则您可能会遇到ClassCastException. 我的意思是将 Object of 转换Integer为原始 double 的 oyur 行。

否则没关系

还有一个提示,而不是使用:

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

您可以使用

for (Object obj : list)
于 2013-07-04T12:20:43.083 回答