返回实现接口的方法类型

时间:2011-02-07 17:12:09

标签: java methods types return

我很想知道处理实现接口的返回类型方法的最佳实践/ 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也不会导致任何错误或警告。

4 个答案:

答案 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    

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