如果Array是相同数据类型的集合,那么如何在一个数组中存储不同的数据类型?

时间:2014-10-30 13:53:40

标签: java arrays oop object

实际上java的专家说,你可以通过使用Object类的对象来实现这一点,这是java中的宇宙超类。如果可能的话我们如何定义一个数组是同一数据类型的集合?

4 个答案:

答案 0 :(得分:8)

在Java中,数组 a Collection。您的专家似乎正在引用根类型的数组,如

 Object[] array = { "Test", 1, 1.0 };
 for (Object obj : array) {
   System.out.println(obj.getClass());
 }

输出

class java.lang.String
class java.lang.Integer
class java.lang.Double

这是可能的,因为每个Java类型都扩展Object(隐式或显式)和Java可以autobox基元类型。来自Javadoc -

  

Object是类层次结构的根。每个班级都有Object作为超类。所有对象(包括数组)都实现此类的方法。

答案 1 :(得分:1)

是的,它可以完成(如其他答案中所示),但通常将不同类型的对象存储在一个集合中并不是一个很好的做法(不确定您是指数组或集合,如ArrayList,但它没关系),因为它不是类型安全的,并且强制你使用多个instanceof和castings来对该数组/集合的元素做任何有意义的事情。

如果要在数组/集合中存储不同无关类型的对象,最好创建一个以有意义的方式对这些对象进行分组并使用仅包含类对象的数组/集合的类。

public MyClass 
{
    String aString;
    int anInt;
    double aDouble;
    ...
    public MyClass (String a, int b, double c) 
    {
        this.aString = a;
        this.anInt = b;
        this.aDouble = c;
    }
    ...
}

MyClass [] array = { new MyClass("Test", 1, 1.0) , new MyClass("Test2", 2, 2.0) };

通过这种方式,您可以执行以下操作:

for (MyClass obj : array)
    if (obj.getaString().contains("something")) {}

如果你只是把所有对象都抛到一个Object数组(Object [])中,就不能像array [0] .contains(“something”)这样做,因为Object没有contains方法,如果将array [0]强制转换为String,如果不先检查数组[0]的类型,则会冒着ClassCastException的风险。

答案 2 :(得分:0)

因为在声明数组时指定了数据类型。数组中的每个对象都直接或通过超类具有此数据类型。例如:

Person[] people = new Person[3];
people[0] = new Employee();// where Employee extends Person
people[1] = new Teacher(); // where Teacher extends Person
people[2] = new Person();

所有这些对象都将Person作为其超类。这就是它运作的原因。

答案 3 :(得分:0)

这是真的。

我们假设您有两个类:动物和植物以及这些类的一个对象:

Animal cat = new Animal();
Plant tree = new Plant();

将它们存储在对象类型集合中:

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

myList.add(cat);
myList.add(tree);

由于Animal和Plant类是Object类的后代(在Java中,一切都是Object类的后代),而Collection可以保存Object类型的对象,因此可以将这两个对象添加到集合中。