理解Java中的多态性

时间:2014-06-10 20:06:30

标签: 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.

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

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

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

4 个答案:

答案 0 :(得分:5)

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

这正是多态性的优势。

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

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

答案 1 :(得分:1)

理想情况下,您是don't want to treat them differently,但如果您想确定类型,可以使用instanceof进行检查:

Node n = i.next();
if (n instanceof Tag) {
  // behavior
}

答案 2 :(得分:0)

正如其他人所说,明确检查对象所属的子类是不必要的,也是一种不好的风格。但如果您真的需要它,可以使用instanceof operator

答案 3 :(得分:0)

多态行为意味着如果你知道它是什么类型的Node,你真的不在乎。您只需调用API,行为将按照具体类型的实现进行。

但如果您真的需要知道,其中一种方法是使用instanceof来确定哪种类型。例如,

    if( i instanceof tag )
    // handle tag
    else if( i instanceof data)
    //handle data