如何使用子类或超类定义Java函数的返回类型和参数?

R R*_*Ree 5 java generics inheritance list arraylist

例如,如果我有类似的功能

public List<E> sort(ArrayList<E> list) {...}
Run Code Online (Sandbox Code Playgroud)

我的同学告诉我,我们应该使用List作为返回类型,因为返回类型应该尽可能广泛.他的理由是,如果我们当前返回一个ArrayList,我们可以更改为返回LinkedList或其他类型.它增加了灵活性.

但是我们收到的函数参数应尽可能窄.这是因为我们可能需要在sort函数中使用一些只由ArrayList实现的函数.

所以我的问题是:是否有任何广泛接受的指南/最佳实践建议函数的形式参数应尽可能窄?如果不是,反对的主要论点是什么?

=============================================

只是为了澄清这一点.

public List<E> sort(ArrayList<E> list) {...}
Run Code Online (Sandbox Code Playgroud)

这只是一个例子,List和ArrayList可以被任何其他Super Class和SubClass替换.我们假设SubClass中只存在一些函数.

public <E> SuperClass<E> sort(SubClass<E> object) {...}
Run Code Online (Sandbox Code Playgroud)

Ita*_*man 2

大多数程序员都会同意,您所描述的尽可能广泛的回报是一件好事(由于灵活性因素)。

我相信很多人会争辩说,尽可能广泛的准则也适用于参数,因为它允许您的函数在更广泛的范围内使用:如果代码中的某个位置有一个对象,LinkedList该位置将能够如果您的方法是使用类型 的参数定义的,则调用您的方法(如果需要排序)List,但如果您的方法是使用类型 的参数定义,则它将无法调用您的方法ArrayList

所以总的来说,尽可能广泛是一个很好的指导方针。当然,由您(作为该方法的作者)决定“尽可能广泛”对您意味着什么。具体来说,如果您可以使其更广泛,但需要付出一些代价(例如,更复杂的实现),您必须决定是否愿意接受这种额外的复杂性(更高的错误机会)以换取更广泛的适用性。