我很想知道处理实现接口的返回类型方法的最佳实践/ 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也不会导致任何错误或警告。
答案 0 :(得分:3)
从Java 5开始,重写的方法可以返回超类中提到的返回类型的接口/类的任何子类。除非特别要求,否则我将坚持返回接口(这主要发生在重构客户端已经在使用特定实现类的旧代码时,而我们现在正在重构它以形成类层次结构)。
答案 1 :(得分:2)
嗯,你提到的已经称为协变返回,它在jdk 1.5之前不存在。 Covariant返回概念已添加到Java语言中以支持Java Generics。有关详细信息,请http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
我更喜欢TreeNode作为TreeNode类的返回类型。
答案 2 :(得分:2)
您需要确定TreeNode对象应该做什么。如果其节点除了实现ITreeNode的TreeNode之外还可以包含其他内容,那么不仅返回类型需要是ITreeNode,而且实例成员也需要是ITreeNode。否则,如果它的TreeNodes一直向下,那么我不清楚你为什么要打扰一个界面。
答案 3 :(得分:0)
根据我的说法,返回类型应该是Interface Type.Reason的类型,以便您以后可以更改底层实现
1 Example> ITreeNode node = new Tree1(); // First Underlying Implementation
2 Example> ITreeNode node1 = new Tree2(); // Second Underlying Implementation
我想,如果我错了,请纠正我。