多态性无法正常工作

时间:2008-12-03 13:10:02

标签: java

我有一个名为Dictionary的接口,它有一个方法insert()。此接口由类BSTree实现,但我还有一个类AVLTree,它是BSTree的子类。 AVLTree重新定义insert()以满足其需求。现在,如果我输入以下代码:

Dictionary data=new AVLTree();
data.insert();

存在问题,因为调用的insert()方法是BSTree而不是AVLTree。为什么多态性不在这里?什么是适当的解决方案,保留多态性的原则?

4 个答案:

答案 0 :(得分:6)

当你说AVLTree“重新定义”插入时,你究竟是什么意思?它必须覆盖该方法,这意味着具有完全相同的签名(模数方差)。

你能在BSTree和AVLTree中发布insert()的签名吗?

如果在AVLTree中应用@Override注释(假设适当的最近JDK),如果您没有正确的签名,则应该收到警告/错误。

答案 1 :(得分:2)

您必须提供更多代码段。我想它看起来像那样:

public Interface Dictionary {
  ...
  public void insert();
  ...
}

public Class BSTree implements Dictionary {
  ...
  public void insert() {
    // some implementation here
  }
  ...
}

public Class AVLTree extends BSTree {
  ...
  public void insert() {
    // another implementation of insert
  }
  ...
}

这实际上应该有效。也许你曾经在某处使用过私人或最终修饰符?

此致

答案 2 :(得分:2)

已经解决了。在接口Dictionary中,函数看起来像insert(Object x),BSTree遵循这个需求并将参数定义为Object,但在AVLTree中参数是Comparable类型,在将其更改为Object之后它起作用。

非常感谢:)

答案 3 :(得分:1)

在java中,(我说的是相对于C ++),多态性应该“永远”起作用。没有看代码就很难看出什么是错的。也许你可以发帖有趣的部分?比如方法的签名,类声明等等。我的猜测是你没有为这两种方法使用相同的签名。