我很想知道什么是处理实现接口的方法的返回类型的最佳实践/ 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开始,重写的方法可以返回超类中提到的返回类型的接口/类的任何子类。除非特别要求,否则我将坚持返回接口(这主要是在重构旧代码时(客户端已经使用特定的实现类,而现在我们将其重构为一个类层次结构))。