理解Java中的多态性

Mic*_*ael 0 java polymorphism

十多年来我没有编写任何Java代码.我很享受,但我不认为我得到了多态编程的一些细节.我有一个抽象的Node类,它有标记和数据子类(以及其他),我将它们存储在ArrayList中.

但是当我通过Iterator将它们从ArrayList中取出时,我得到了Node对象.我不确定如何最好地处理从迭代器返回的对象.

这是一个例子:

// initialize the list
TagNode tag = new TagNode();
ArrayList<Node> list = new ArrayList<>();
list.add(tag);
// And many more go into the list, some TagNodes, some DataNodes, etc.
Run Code Online (Sandbox Code Playgroud)

后来我使用迭代器来处理它们:

Iterator<Node> i = list.iterator();
Node n = i.next();
// How do I tell if n is a TagNode or a DataNode?
Run Code Online (Sandbox Code Playgroud)

我知道我可以转换到其中一个Node子类,但我怎么知道要使用哪个子类?我是否需要在Node类中嵌入类型信息?

Men*_*ena 5

在大多数情况下,您不应该知道哪个子类是哪个.

这正是多态性的优势.

如果您的层次结构设计是可靠的,那么Node将具有对您的List项执行操作所需的所有行为(==方法),而不必担心它们是哪个子类实例:重写方法在运行时解析.

在某些情况下,您可能希望使用instanceof运算符来实际检查classNode所属的子项,但我认为这是一种罕见的情况,最好在一般原则中避免使用.