我有一个名为Recipient
的抽象超类以及两个子类OfficialRecipient
和PersonnelRecipient
。 OfficialRecipient
有一个子类OfficeFriendRecipient
。我还定义了具有方法InputOutput
的类UpdateFile
。这里的Recipient
类具有方法getName ()
,getEmail ()
,而OfficialRecipient
具有方法getDesignation ()
。
我有一个定义如下的数组列表:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
List <OfficialRecipient> official = new ArrayList<>();
当我尝试编写以下代码时,java显示错误。当我将指针投射到OfficialRecipient
时,该错误已纠正。
Iterator <Recipient> pointer = official.iterator();
while (pointer.hasNext()) InputOutput.UpdateFile("official", pointer.getName (), "null", pointer.getEmail (), pointer.getDesignation (), "null", filePath);
我的问题是为什么超类指针不能处理子类official
列表。多态性应该做吗?
我刚刚开始学习Java,但无法理解这个概念。请简要说明。
这样编写时,代码编译正确:
Iterator <OfficialRecipient> pointer = official.iterator();
while (pointer.hasNext()) InputOutput.UpdateFile("official", ((Recipient) pointer).getName (), "null", ((Recipient) pointer).getEmail (), ((OfficialRecipient) pointer).getDesignation (), "null", filePath);
答案 0 :(得分:0)
您显示的代码无效。如果pointer
是Iterator
实例,则无法使用Recipient
访问pointer
的方法。您首先需要通过调用Recipient recipient = pointer.next()
获得下一个元素。然后,您可以使用变量Recipient
而不是recipient
来调用pointer
的方法。
recipient.getDescription()
不起作用,因为getDescription()
没有在类Recipient
中声明。但是,如果从第二个Iterator<OfficialRecipient>
获得下一个元素,例如OfficialRecipient recipient = pointer.next()
,则recipient
的类型为OfficialRecipient
,其中定义了getDescription()
。因此,您可以呼叫recipient.getDescription()
。这样就不必进行强制转换了。
总结:
Iterator<T>
将为您提供T
的下一个元素,但不是T
的实例。 @see:How do I iterate and modify Java Sets?