簡體   English   中英

為什么我可以將 Arrays.asList 方法與為接口 List 聲明的對象一起使用,但當它被聲明為類 ArrayList 的實例時卻不能使用?

[英]Why I am able to use Arrays.asList method with an object declared for interface, List, but not when it is declared as an instance of class ArrayList?

//Splitting a string and passing it to a String Array
String[] b1 = a1.split("");

//The Following throws a compile-time error
ArrayList<String> arrayList1 =  new ArrayList<String>();
arrayList1 = Arrays.asList(b1);

//The following works
List<String> arrayList1 =  new ArrayList<String>();
arrayList1 = Arrays.asList(b1);

我想知道為什么第一種方法會引發錯誤而第二種方法效果很好? ArrayList實現了List接口,所以它應該可以很好地工作。

ArrayList實現了List接口,所以它應該可以很好地工作。

不,這不是它的工作原理。 如果某些東西返回接口的實現,您可以將其分配給聲明為該接口的對象,而不是相反。

這就是你在做的時候

List<String> arrayList1 =  new ArrayList<String>();

這是完全合法的。

但是如果asList返回的是 List 而不是 ArrayList 的東西(這就是這里發生的事情)怎么辦? 您會收到錯誤消息,因為您將不是ArrayList (並且不是從它下降)的內容分配給ArrayList

另請注意,只要您執行arrayList1 = Arrays.asList(b1); 在第二個測試中,您將新的ArrayList分配給arrayList1的事實完全無關緊要,因為您將在下一行覆蓋它,因此arrayList1只是一個List ,正如聲明的那樣。

Java 是靜態類型的,當你說一個變量是一個String你不能給它分配一個int 你的例子也是如此。 當您將arrayList1聲明為ArrayList<String>您不能為其分配List<String> 因為您不能確定從Arrays.asList()返回的值真的是java.util.ArrayList一個實例。

還要注意存在兩個名為ArrayList java 類。 一個來自java.util ,另一個來自java.util.Arrays 前者是public ,后者在Arrays類中是private

Arrays.asList(b1) 返回一個 java.util.Arrays.ArrayList 類型的對象,它是 Arrays 中的一個嵌套類。

換句話說,您的問題是為什么無法將類型為 java.util.Arrays.ArrayList 的 b1 轉換為類型為 java.util.ArrayList 的 arrayList1 :這是兩種完全不同的類型,根本不相關。

如果你需要一個 java.util.ArrayList,你可以創建一個副本:

ArrayList arrayList1 = new ArrayList<>(Arrays.asList(b1));

問候

暫無
暫無

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

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