2015-06-26 32 views
-1

我使用的返回類型List<>的方法,而我則可以調用該方法List爲什麼不需要聲明List實現?

​​

要清楚artistsPager.artists.items將返回類型List<Artist>

由於List只是一個接口,如何編譯器讓我使用這個artists對象,沒有一個List<>總是需要一個實現,如ArrayList

例如,編譯器不會讓我做到以下幾點,因爲「List是抽象的,不能被實例化」:

List<Integer> list = new List<Integer>(); 

如何爲artistsPager.artists.itemsnew List<Integer>()有什麼不同?

對於那些好奇,這來自Java Web API wrapper for Android。所有的幫助非常感謝。

我不認爲這是這個question的重複,因爲即使答案是相同的,但它們產生的問題是不同的。另一個問題是詢問類型ListArrayList之間的差異,而我的問題想知道爲什麼編譯器沒有抱怨List的實現被隱藏。

我很好,有這標記爲重複,以指導未來的用戶到那個問題,但我不認爲它應該被關閉作爲答案,我認爲這將是非常有用的其他用戶。

+1

您應該查看interfaces/abstract類並查看它們在Java中的使用方式。這是一組重要的知識,特別是在處理像Android和JDK這樣的高級類庫時,因爲它們幾乎在任何地方都使用了接口。 –

+0

感謝@DaveLugg,我很困惑,因爲我查看了Spotify API的源代碼,並且找不到其他類型列表的任何實例。下次我會相信編譯器!有沒有什麼快速的方法來確定List <>實際實現的位置,而不是遍歷代碼? – Richard

+1

使用接口的一點是,你不應該關心它的實現,只是它是一個'List'。 ArrayList類型是它的一個實現,可能是最常見的。所以你可以使用'List list = new ArrayList ();'。 您可以在oracle docs(https://docs.oracle.com/javase/6/docs/api/java/util/List.html)中找到List接口的默認實現,並參閱「所有已知的實現類」 –

回答

3

artistsPager.artists.items與new List<Integer>()有什麼不同?

artistsPager.artists.itemsList<>類型的字段。在代碼的某個地方,它必須通過一個具體的實現例如ArrayList來實例化。

new List<Integer>()是一個構造函數調用,它是無效的,因爲List是一個接口。

+0

明白了,我想我很困惑,因爲我沒有看到類型List <>的具體實現。 – Richard

0

這意味着某個地方創建了一個具體列表(例如,一個ArrayList)。

您只知道所創建的列表正在實現List接口中的方法,從而允許您使用這些方法。

拿這個例子從用戶隱藏了具體LinkedList

public static List<Integer> makeListOfInts(){ 
    return new LinkedList<Integer>(){ 
     { 
      add(1); 
      add(2); 
     } 
    } 
} 

我可以用ArrayList輕易更換:

public static List<Integer> makeListOfInts(){ 
    return new ArrayList<Integer>(){ 
     { 
      add(1); 
      add(2); 
     } 
    } 
} 

和函數的用戶知道一切是返回一個List ,但它不知道列表的具體類型。它只能使用List接口的功能,而不能使用選定的特定實現。

2

不是List<>總是需要一個實現,比如ArrayList<>

是的,你需要一個實現來創建一個實例。然而,編譯器知道兩兩件事:

  • 它知道你已經創建一些實例,並將其分配給items,並
  • 它知道,無論你已分配給items,實現List<>接口

知道這兩件事就足夠讓編譯器讓你在聲明爲接口類型的變量上調用add。通過這種方式,您的代碼不需要關心您獲得的實現 - ArrayList<>LinkedList<>或您開發的一些自定義實現:您的代碼可以與所有這些實現一起使用。

請注意,通過其接口類型引用對象的做法是可取的。它被稱爲編程接口。它可以讓你隱藏實現細節,並在稍後爲不同的實現交換對象。

相關問題