java - 如何使用子类或父类(super class)定义 Java 函数的返回类型和参数?

标签 java list generics inheritance arraylist

例如,如果我有一个像这样的函数

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/

相关文章:

java - Spring Security LDAP 登录错误凭证

java - Java 中列表的比较、处理和删除条目

c# - 使用 Linq 从列表中过滤列表

c# - 实现 IComparable<T>

c# - 为运行时初始化传递一个通用(模板)类

java - 为什么通过引用比较整数 (==) 有效?

java - 在Java中的TextField中仅引入数字形成间隔

python - 在 python 中复制列表

r - 将嵌套列表转换为数据框

java - 动态调用静态方法而不使用反射