我有一个里面有对象的数组。我将如何在数组元素上使用方法?
我的数组是Object
. 我试过array[i].getSalary()
了,但这不起作用。
首先,您几乎不应该使用Object
. 原因是您丢失了所有类型信息:
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()!");
}
但是您会发现它变得更加冗长,如果将其乘以必须调用这些对象的方法的次数,那么代码将变得难以管理。
你里面的所有对象object[]
都有getSalary()
方法吗?
如果没有,那么您显然可以看到为什么编译器不允许您这样做。如果您最终遇到这种情况,您的代码中的某处会发生一些有趣的事情。
如果是,它是同一getSalary()
方法还是同一类层次结构中同一方法的多个动态绑定实现?
如果两者都不是,您可能应该创建一个IHasSalary
公开此类方法的接口(我知道这个名字很蹩脚),让所有这些对象都实现该接口,然后将数组声明为IHasSalary[]
.
如果是,找到它们最专业的共同祖先,说它是 class Employee
,并将数组声明为Employee[]
。