0

我有一个里面有对象的数组。我将如何在数组元素上使用方法?

我的数组是Object. 我试过array[i].getSalary()了,但这不起作用。

4

2 回答 2

4

首先,您几乎不应该使用Object. 原因是您丢失了所有类型信息:

  • 将使那些将阅读您的代码的人(包括您的教授、您自己和六个月后您将忘记有关代码的所有内容的您自己)更容易理解代码
  • 编译器和您的 IDE 甚至可以在您测试程序之前告诉您何时出错。
  • 将避免我将在此答案的第二部分向您解释的容易出错的类型。

Object使用与将放入其中的对象(或公共基类)的类型相对应的类型的数组,而不是数组。假设你的类被调用Employee,你应该这样声明你的数组:

Employee[] employeeArray;

employeeArray这是一个更好的名称,array因为它告诉它包含什么样的对象,再次为了可读性。通常,更喜欢变量的显式名称。)

employeeArray[i].getSalary()如果该类Employee包含此类方法,则使用该解决方案很容易使用。当您阅读它时,此代码的意图也很明显。

其他可能性是通用集合,如List<Employee>or Set<Employee>,具体取决于您的需要。

如果您确实必须使用 Object 数组并调用getSalary()方法,则必须将数组元素强制转换为该方法getSalary()所属的类或接口。

例如,如果这个类被调用Employee

Employee employee = (Employee) array[i];
employee.getSalary();

强制转换的作用是获取对象的 Employee 类型的引用。该对象仍然是相同的,但现在您可以调用Employee该对象的方法。

但是这个解决方案有很多注意事项。首先,它更冗长,需要两行才能完成本来可以只写一行的内容。其次,更重要的是,既然你有一个 的数组Object,你不能确定你真的有一个类型的对象Employee,如果不是这样,操作会抛出一个ClassCastException。解决这个问题的方法是首先检查对象是否真的是所需的类型:

Object object = array[i];
if (object instanceof Employee) {
    Employee employee = (Employee) object;
    employee.getSalary();
}
else {
    System.err.println("Object is not an Employee: we can not call getSalary()!");
}

但是您会发现它变得更加冗长,如果将其乘以必须调用这些对象的方法的次数,那么代码将变得难以管理。

于 2013-02-07T00:46:07.550 回答
0

你里面的所有对象object[]都有getSalary()方法吗?

  • 如果没有,那么您显然可以看到为什么编译器不允许您这样做。如果您最终遇到这种情况,您的代码中的某处会发生一些有趣的事情。

  • 如果是,它是同一getSalary()方法还是同一类层次结构中同一方法的多个动态绑定实现?

    • 如果两者都不是,您可能应该创建一个IHasSalary公开此类方法的接口(我知道这个名字很蹩脚),让所有这些对象都实现该接口,然后将数组声明为IHasSalary[].

    • 如果是,找到它们最专业的共同祖先,说它是 class Employee,并将数组声明为Employee[]

于 2013-02-07T01:00:57.083 回答