例如,如果我有一个像这样的函数
public List<E> sort(ArrayList<E> list) {...}
我的同学告诉我,我们应该使用 List 作为返回类型,因为返回类型应该尽可能广泛。他的理由是,如果我们当前返回一个 ArrayList,我们可以稍后更改为返回一个 LinkedList 或其他类型。它增加了灵 active 。
但是我们接收到的函数参数应该越窄越好。这是因为我们可能需要在排序函数中使用一些仅由 ArrayList 实现的函数。
所以我的问题是:是否有任何被广泛接受的指南/最佳实践建议函数的形式参数的类型应尽可能窄?如果不是,反对的主要论点是什么?
=============================================
只是为了澄清这一点。
public List<E> sort(ArrayList<E> list) {...}
这只是一个示例,List 和 ArrayList 可以用任何其他父类(super class)和子类代替。让我们假设有一些功能只存在于子类中。
public <E> SuperClass<E> sort(SubClass<E> object) {...}
最佳答案
大多数程序员会同意您描述的尽可能广泛的返回是一件好事(由于灵 active 因素)。
我相信很多人会争辩说,尽可能广泛的准则也适用于参数,因为它允许您的函数在更广泛的范围内使用:如果在代码中的某个地方有一个 LinkedList
对象,如果它是用 List
类型的参数定义的,那么该位置将能够调用您的方法(如果它需要排序),但它不能调用您的方法,如果它是用 ArrayList
类型的参数定义的。
所以一般来说,尽可能广泛是一个很好的指导方针。当然,由您(作为该方法的作者)来确定“尽可能广泛”对您意味着什么。具体来说,如果您可以使其更广泛但需要一些成本(例如,更复杂的实现),您必须决定是否愿意接受这种额外的复杂性(更高的错误机会)以换取更广泛的适用性。
关于java - 如何使用子类或父类(super class)定义 Java 函数的返回类型和参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48855769/