我有一个名为Dictionary的接口,它有一个方法insert()
。此接口由类BSTree
实现,但我还有一个类AVLTree
,它是BSTree
的子类。 AVLTree
重新定义insert()
以满足其需求。现在,如果我输入以下代码:
Dictionary data=new AVLTree();
data.insert();
存在问题,因为调用的insert()
方法是BSTree
而不是AVLTree
。为什么多态性不在这里?什么是适当的解决方案,保留多态性的原则?
答案 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 ++),多态性应该“永远”起作用。没有看代码就很难看出什么是错的。也许你可以发帖有趣的部分?比如方法的签名,类声明等等。我的猜测是你没有为这两种方法使用相同的签名。