Java 实现接口的方法的返回类型

Java 实现接口的方法的返回类型,java,methods,types,return,Java,Methods,Types,Return,我很想知道处理实现接口的返回类型方法的最佳实践/SE约定是什么。具体来说,假设我们正在实现一个简单的树,其接口如下: public interface ITreeNode { public ITreeNode getLeftChild(); public ITreeNode getRightChild(); public ITreeNode getParent(); } 我们有一个类TreeNode,它实现了: public class TreeNode impleme

我很想知道处理实现接口的返回类型方法的最佳实践/SE约定是什么。具体来说,假设我们正在实现一个简单的树,其接口如下:

public interface ITreeNode {
    public ITreeNode getLeftChild();
    public ITreeNode getRightChild();
    public ITreeNode getParent();
}
我们有一个类TreeNode,它实现了:

public class TreeNode implements ITreeNode {
    private TreeNode LeftChild, RightChild, Parent;
    @Override
    public ITreeNode getLeftChild() {
        return this.LeftChild;
    }

    @Override
    public ITreeNode getRightChild() {
        return this.RightChild;
    }

    @Override
    public ITreeNode getParent() {
        return this.Parent;
    }
}
我的问题是。。各自实现的方法的返回类型应该是ITreeNode还是TreeNode,以及原因


Eclipse会自动为TreeNode填充返回类型为ITreeNode的方法。但是,即使使用@Override标志,将其更改为TreeNode也不会导致任何错误或警告。

自Java 5以来,被重写的方法可以返回超类中提到的返回类型的接口/类的任何子类。除非特别需要,否则我将坚持返回接口(这主要发生在重构旧代码时,客户机已经在使用特定的实现类,而我们现在正在重构它以形成类层次结构),返回类型应为接口类型.Reason,以便以后可以更改基础实现

1 Example> ITreeNode node = new Tree1();  // First Underlying Implementation     
2 Example> ITreeNode node1 = new Tree2(); // Second Underlying Implementation    

我想,如果我错了,请纠正我

您提到的所谓协变返回,它在JDK1.5之前是不存在的。Java语言中添加了协变返回概念以支持Java泛型。欲了解更多信息


我更喜欢TreeNode作为TreeNode类的返回类型

您需要决定TreeNode对象应该做什么。如果其节点可以包含除实现ITreeNode的TreeNode之外的其他内容,那么不仅返回类型需要是ITreeNode,实例成员也需要是ITreeNode。否则,如果一直都是TreeNodes,那么我不清楚为什么要麻烦使用接口