我有一个作业,我有一个包含接口类的库。 [InfoItem]
我实现了这个类[Item]。
现在我需要编写一个方法watchProgram(InfoItem item)[其他类,导入InfoItem],其中(如图所示)需要一个 InfoItem。
传递的参数项有一个变量'Recorded'[boolean],我想用我在InfoItem实现中定义的方法changeRecorded()进行编辑。
我无法编辑界面,我收到一条错误消息,指出找不到该方法[无法找到符号] ..
任何提示,建议和解决方案? 谢谢!
-Samuel -
答案 0 :(得分:4)
在方法watchProgram
中,所有Java都知道参数是InfoItem
。该论点可能是也可能不是Item
,因此它可能有也可能没有changeRecorded
方法。由于Java无法保证对象具有该方法,因此在编译类时无法插入代码来调用该方法。就Java编译器而言,参数changeRecorded
中不存在方法item
。
通常当你遇到这样的情况时,这表明你不应该首先调用changeRecorded
方法。仔细考虑您认为自己需要它的原因以及如何在不使用它的情况下更改自己的代码。例如,如果有人要使用watchProgram
方法调用您的InfoItem
方法而没有changeRecorded
方法,那么watchProgram
应该做什么?
如果经过一些仔细考虑后,您确定当传入的参数是changeRecorded
的实例时,您需要确实来调用Item
方法,您可以使用强制转换来执行此操作:
watchProgram(InfoItem item) {
// do stuff
if (item instanceof Item) { // thanks to ruslan for if statement
Item castedItem = (Item)item;
castedItem.changeRecorded();
}
// do stuff
}
但正如我所说,这种事情应该谨慎使用。面向对象编程(特别是多态)的全部意义在于,不必须这样做。
答案 1 :(得分:1)
您可以尝试下一个技巧,这可能是您的选择:
if (item instanceof Item) {
Item myItem = (Item) item;
myItem.changeRecorded();
}
在你的watchProgram()方法中使用此代码。
这里我们检查参数项是否是Item类的类型,然后它是否转换为此类型并调用Item.changeRecorded()方法。
答案 2 :(得分:1)
if (item instanceof Item) {
((Item)item).changeRecorded();
}
但请注意,如果可以避免,这不是好的做法。我想看看是否有办法只使用界面中定义的方法做你想做的事情,可能通过使更改成为其他方法的副作用。
如果您正在做的事情是记录已经对InfoItem做了某些事情的事实,您可能还会考虑将事实记录在对象的其他地方。