为什么超类对象无法处理子类列表

时间:2018-09-29 18:18:46

标签: java arraylist polymorphism

我有一个名为Recipient的抽象超类以及两个子类OfficialRecipientPersonnelRecipientOfficialRecipient有一个子类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);

1 个答案:

答案 0 :(得分:0)

您显示的代码无效。如果pointerIterator实例,则无法使用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?
  • 第二点是上面链接的问题,该问题已经被标记为重复。