Java重写问题(确定实现类中的参数/返回类型)

Java重写问题(确定实现类中的参数/返回类型),java,Java,我真的不明白为什么Java不允许这样做 接口 package api; public interface TreeNode { public boolean isValidBST(TreeNode root); } 实施 package impl; public class TreeNodeImpl implements api.TreeNode { @Override public boolean isValidBST(TreeNodeImpl root) {

我真的不明白为什么Java不允许这样做

接口

package api;

public interface TreeNode {
    public boolean isValidBST(TreeNode root);
}
实施

package impl;

public class TreeNodeImpl implements api.TreeNode {
    @Override
    public boolean isValidBST(TreeNodeImpl root) {
        return false;
    }
}
从我的理解来看,这个错误没有意义:


根据接口定义,接口树节点的每个实现都必须有一个方法isValidBST。。。它以树节点作为参数。另一方面,您的实现TreeNodeImpl只将TreeNodeImpls作为所有TreeNode的子集的参数。例如,如果存在其他类,而TreeNodeImpl实现了TreeNode,则调用

TreeNode node = new TreeNodeImpl();
node.isValidBST(new OtherTreeNodeImpl());
将导致编译时错误,尽管它们在查看接口时看起来非常好。这就是为什么编译器正确地声明您的方法没有重写父方法

您可以使用泛型通过指定

public interface TreeNode<T extends TreeNode<T>> {
    public boolean isValidBST(T root);
}


但对我来说,这似乎是一个肮脏的黑客。界面应该减少摩擦,但这个界面引入了摩擦。因此,您应该以这样的方式设计接口TreeNode,即只在方法isValidBST中使用TreeNode中定义的方法。。。。如果设计正确,您应该能够指定isValidBST的实现。。。与TreeNode中相同。

因为参数是TreeNodeImpl root而不是TreeNode root。这是一个印刷错误,还是您想知道为什么参数不能是TreeNodeImpl?接口需要一个接受任何TreeNode的方法实现。一个接受TreeNode专门化的方法是不够的。或多或少相同的原因列表不是列表的子类。
public class TreeNodeImpl implements TreeNode<TreeNodeImpl> {
    @Override
    public boolean isValidBST(TreeNodeImpl root) {
        return false;
    }
}