我很想知道什么是处理实现接口的方法的返回类型的最佳实践/ 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会使用ITreeNode的返回类型自动填充TreeNode的方法。但是,即使使用@Override标志,将其更改为TreeNode也不会引起任何错误或警告。

最佳答案

从Java 5开始,重写的方法可以返回超类中提到的返回类型的接口/类的任何子类。除非特别要求,否则我将坚持返回接口(这主要是在重构旧代码时(客户端已经使用特定的实现类,而现在我们将其重构为一个类层次结构))。

10-04 21:08