[英]What is the difference in these two declarations?
List<String> someName = new ArrayList<String>();
ArrayList<String> someName = new ArrayList<String>();
聲明之間的區別更多是樣式。 最好使用抽象而不是具體實現來聲明變量,因為您可以在以后更改實現選擇而不更改變量類型。 例如,您可以更改List以使用LinkedList。
如果您總是使用抽象類型(接口或抽象類),尤其是在方法簽名中,客戶端代碼可以自由使用他們喜歡的任何實現。 這使代碼更靈活,更易於維護。
即使是變量聲明也是如此。 考慮一下:
public abstract class MyListUsingClass {
private List<String> list;
protected MyListUsingClass(List<String> list) {
this.list = list;
}
...
}
如果變量list
聲明為ArrayList
,則構造函數中只接受ArrayLists。 這將是一個糟糕的選擇:總是嘗試讓客戶端代碼選擇他們想要使用的實現。
關於你的最后一個問題:接口對類的方法有相同的限制,所以是的,你可以重載方法 。
LinkedList
實現 - 這對你的所有代碼都不會那么有害 LinkedList
或ArrayList
)或只是數組(EMail [])。 如果您提供更多信息 - 這可能會有所幫助。 編輯2.在這兩種情況下,它們都是字符串的ArrayList。 區別在於,在第一種情況下,您正在進行超類的轉換(無法訪問特定於ArrayList
某些方法)
在第一個原因中,您聲明了var類型列表並使用ArrayList作為其實現。
在第二種情況下,您將聲明並定義數組列表。
不同之處在於,使用interface
類型(如第一種情況),您將只訪問List
接口中定義的那些方法,如果ArrayList
有一些特定的實現方法,為了訪問它們,您需要轉換列表到它的子類型(ArrayList)。
在第二種情況下,您使用的是更具體的類型,因此根本不需要強制轉換。
void draw()
方法,那么實現兩者的類將必須決定單個實現是什么。 Cowboy和Artist不可能有一個,因為接口沒有任何實現的概念。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.