簡體   English   中英

如何使用子類或超類定義Java函數的返回類型和參數?

[英]How to define Java function's return type and parameters, using subclass or superclass?

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

public List<E> sort(ArrayList<E> list) {...}

我的同學告訴我,我們應該使用List作為返回類型,因為返回類型應該盡可能廣泛。 他的理由是,如果我們當前返回一個ArrayList,我們可以更改為返回LinkedList或其他類型。 它增加了靈活性。

但是我們收到的函數參數應盡可能窄。 這是因為我們可能需要在sort函數中使用一些只由ArrayList實現的函數。

所以我的問題是:是否有任何廣泛接受的指南/最佳實踐建議函數的形式參數應盡可能窄? 如果不是,反對的主要論點是什么?

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

只是為了澄清這一點。

public List<E> sort(ArrayList<E> list) {...}

這只是一個例子,List和ArrayList可以被任何其他Super Class和SubClass替換。 我們假設SubClass中只存在一些函數。

public <E> SuperClass<E> sort(SubClass<E> object) {...}

大多數程序員都會同意,盡可能廣泛的回報是你所描述的好事(由於靈活性因素)。

我相信很多人會爭辯說,盡可能廣泛的指南也適用於參數,因為它允許從更廣泛的范圍使用你的函數:如果在代碼的某個地方有一個LinkedList對象,那個地方就能夠調用你的方法(如果它需要排序)如果它是用List類型的參數定義的,但是如果它是用ArrayList類型的參數定義的話,它將無法調用你的方法。

所以一般來說,盡可能廣泛是一個很好的指導方針。 當然,由您(作為方法的作者)決定“盡可能廣泛”對您來說意味着什么。 具體來說,如果你可以使它更廣泛但有一些成本(例如,更復雜的實現),你必須決定是否願意接受這種額外的復雜性(更高的錯誤機會)以換取更廣泛的適用性。

要正確應用泛型,您應該接受並返回由ArrayList,LinkedList等實現的相同接口。 不要忘記返回類型參數<E>

public <E> List<E> sort(List<E> list) {
    ...
    return list;    
}

此方法適用於以下所有List實現(我不記得所有):

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) 

因為如果你想在不傳遞Comparator情況下對List進行排序,那么這些元素需要以某種方式, 可比性

然后, 通常 ,返回List vs ArrayList ,選擇應該是List 但不總是。 想象一下Set vs SortedSet一分鍾,返回SortedSet使調用者清楚地知道返回的Set實際已經排序; 而不是返回一個Set

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM