java:如何在不强制值类型的情况下创建动态数组?

时间:2010-04-09 13:58:30

标签: java arrays

我需要在Java中创建一个动态数组,但值类型从String到Int不同于float。如何创建一个动态列表,我不需要在高级中给出值的类型?

键只需要升序(1,2,3,4或0,1,2,3,4)

我检查了ArrayList,但似乎我必须给它一个固定类型的值。

谢谢!

4 个答案:

答案 0 :(得分:4)

您可以拥有一个数组或ArrayList Objects,这样您就可以包含Stringintfloat元素。

答案 1 :(得分:2)

您可以使用:

List<Object> myList = new ArrayList<Object>();

Integer i = 1;
Double d = 1.2;
String s = "Hello World";

myList.add(i);
myList.add(d);
myList.add(s);

答案 2 :(得分:2)

根据我的经验,很少需要List<Object>。我认为它可能是一种设计气味,我会检查设计,看看另一组结构是否可以更好地代表您的数据。在不知道你想要解决什么的情况下,很难有信心地说,但通常一个人想要把事情放在一个列表中做什么,并且只要它们只是{{{{{{{ 1}},你需要检查他们的类型并获得反思,以摆脱语言基础。将它们存储在更多类型敏感的结构中,您可以在其中以原始类型直接处理它们而不会产生反射魔法。

答案 3 :(得分:1)

它比它的价值更麻烦,但它可以反射地与数组交互。

import java.lang.reflect.Array;
// ...

Object arr = Array.newInstance(int.class, 10);

System.out.println(arr.getClass().getName()); // prints "[I"
System.out.println(Array.getLength(arr)); // prints "10"

Array.set(arr, 5, 42);

if (arr instanceof int[]) {
    int[] nums = (int[]) arr;
    System.out.println(nums[5]); // prints "42"
}

参考

请注意,在API中,您将数组作为Object传递。这是因为Object是所有数组类型的超类,无论是int[].class还是String[][].class。这也意味着编译时安全性很小(一般情况下反射也是如此)。 Array.getLength("mamamia")编译得很好;它会在运行时抛出IllegalArgumentException