Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何定义Java函数';s返回类型和参数,使用子类还是超类?_Java_List_Generics_Inheritance_Arraylist - Fatal编程技术网

如何定义Java函数';s返回类型和参数,使用子类还是超类?

如何定义Java函数';s返回类型和参数,使用子类还是超类?,java,list,generics,inheritance,arraylist,Java,List,Generics,Inheritance,Arraylist,例如,如果我有一个函数 public List<E> sort(ArrayList<E> list) {...} 公共列表排序(ArrayList List){…} 我的同学告诉我,我们应该使用列表作为返回类型,因为返回类型应该尽可能广泛。他的理由是,如果当前返回的是ArrayList,我们可以更改为稍后返回LinkedList或其他类型。它增加了灵活性 但是我们收到的函数参数应该尽可能窄。这是因为我们可能需要在排序函数中使用一些仅由ArrayList实现的函数 所以

例如,如果我有一个函数

public List<E> sort(ArrayList<E> list) {...}
公共列表排序(ArrayList List){…}
我的同学告诉我,我们应该使用列表作为返回类型,因为返回类型应该尽可能广泛。他的理由是,如果当前返回的是ArrayList,我们可以更改为稍后返回LinkedList或其他类型。它增加了灵活性

但是我们收到的函数参数应该尽可能窄。这是因为我们可能需要在排序函数中使用一些仅由ArrayList实现的函数

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

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

我只是想澄清一下

public List<E> sort(ArrayList<E> list) {...}
公共列表排序(ArrayList List){…}
这只是一个例子,List和ArrayList可以被任何其他超类和子类替换。假设子类中只存在一些函数

public <E> SuperClass<E> sort(SubClass<E> object) {...}
公共超类排序(子类对象){…}

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

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


因此,一般来说,尽可能广泛是一个好的指导方针。当然,这取决于你(作为该方法的作者)来确定“尽可能广泛”对你意味着什么。具体地说,如果您可以使其更广泛,但需要付出一定的成本(例如,更复杂的实现),您必须决定是否愿意接受这种额外的复杂性(更高的错误概率),以换取更广泛的适用性。

要正确应用泛型,您应该接受并返回由ArrayList、LinkedList等实现的相同接口。不要忘记返回类型参数

公共列表排序(列表){
...
退货清单;
}
此方法适用于以下所有列表实现(我不记得所有实现):

列表向量=新向量();
列表堆栈=新堆栈();
List arrayList=新建arrayList();
List linkedList=新建linkedList();
List newList1=newmain().sort(向量);
List newList2=newmain().sort(堆栈);
List newList3=newmain().sort(arrayList);
List newList4=newmain().sort(linkedList);

你的同学应该告诉你从正确的声明开始:

public <<E extends Comparable<? super E>>> List<E> sort(List<E> list) 

public您需要特定于ArrayList的哪一部分
trimToSize
ensureCapacity
?如果您希望代码是通用的,您应该返回和接受接口,而不是具体的类。但是,如果您需要接口的特定实现中的特定函数,那么只接受该实现的实例当然是有意义的。@luk2302这只是一个示例,列表和ArrayList可以被任何其他超类和子类替换。假设子类中只存在一些函数。
List<String> vector = new Vector<>();
List<String> stack = new Stack<>();
List<String> arrayList = new ArrayList<>();
List<String> linkedList = new LinkedList<>();

List<String> newList1 = new Main().sort(vector);
List<String> newList2 = new Main().sort(stack);
List<String> newList3 = new Main().sort(arrayList);
List<String> newList4 = new Main().sort(linkedList);
public <<E extends Comparable<? super E>>> List<E> sort(List<E> list)