我有一个包含对象的数组。我如何在数组元素上使用方法?
我的数组是Object
类型。我试过array[i].getSalary()
,但这不起作用。
答案 0 :(得分:4)
首先,您几乎不应该使用Object
数组。原因是您丢失了所有类型信息:
使用与将放入其中的对象类型(或公共基类)对应的类型的数组,而不是Object
数组。假设您的类被称为Employee
,您应该以这种方式声明您的数组:
Employee[] employeeArray;
(employeeArray
是一个比array
更好的名称,因为它告诉它包含哪种对象,再次是为了便于阅读。一般来说,更喜欢变量的显式名称。)
如果类employeeArray[i].getSalary()
包含此类方法,则使用该解决方案很容易使用Employee
。当你阅读它时,这段代码的意图也很明显。
其他可能性是通用集合,例如List<Employee>
或Set<Employee>
,具体取决于您的需求。
如果您真的必须使用Object 数组,并调用getSalary()
方法,则必须将数组元素强制转换为类或方法getSalary()
所属的接口。
例如,如果此类被称为Employee
:
Employee employee = (Employee) array[i];
employee.getSalary();
cast 的作用是获取对象类型为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()!");
}
但是你会发现它变得更加冗长,如果你将它乘以你必须调用这些对象的方法的次数,那么代码将变得无法管理。
答案 1 :(得分:0)
object[]
内的所有对象是否都使用getSalary()
方法?
如果没有,那么你很明显可以看到为什么编译器不允许你这样做。如果你最终遇到这种情况,代码中的某个地方会发生一些有趣的事情。
如果是,是同一个类层次结构中同一个方法的相同getSalary()
方法还是多个动态绑定实现?
如果两者都没有,你应该制作一个接口IHasSalary
(蹩脚的名字,我知道)公开这样的方法,使所有这些对象实现该接口,然后将数组声明为{{1} }。
如果是,请找到最专业的共同祖先,说它是班级IHasSalary[]
,并将数组声明为Employee
。