繁体   English   中英

返回实现接口的方法类型

[英]Return type of method that implements an interface

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

那么,你提到的已经称为协变返回,它在jdk 1.5之前不存在。 Covariant返回概念已添加到Java语言中以支持Java Generics。 有关更多信息,请访问http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

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

您需要决定TreeNode对象应该做什么。 如果其节点除了实现ITreeNode的TreeNode之外还可以包含其他内容,那么不仅返回类型需要是ITreeNode,而且实例成员也需要是ITreeNode。 否则,如果它的TreeNodes一直向下,那么我不清楚你为什么要打扰一个界面。

根据我的说法,返回类型应该是Interface Type.Reason的类型,以便您以后可以更改底层实现

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM