[英]What is the difference between List<Object[]> and List<Object>?
當某個方法將Object []的列表作為輸入時,即使在運行時實際輸入的是Object的列表,該方法仍然可以使用。 問題是,對於Java中的泛型來說, List<something>
真正含義是什么? List<Object[]>
和List<Object>
之間有什么區別?
/*
* if name is "A", then the input is a List<Object[]>
* if name is "B", then the input actually is a List<Object>
*/
public List<String> convert(List<Object[]> objectList, String name) {
List<String> resultList = new ArrayList<String>();
if (StringUtils.equals(name, "A")) {
for (Object[] object : objectList) {
String code = StringUtils.join((String) object[0], (String) object[1]);
resultList.add(code);
}
return resultList;
}
else if(StringUtils.equals(name, "B")) {
for (Object object : objectList) {
String code = (String) object;
resultList.add(code);
}
return resultList;
}
}
實際上,在運行時,此方法可以正常工作,並且同時使用List<Object[]>
和List<Object>
。
只是想知道任何人都可以對它如何工作進行一些解釋。
所以依次回答:
對於Java中的泛型, List<something>
真正含義是什么? 使用<>
括號符號可以指定所需的泛型類的特定類型 。 基本上, List
可以是List<A>
, List<B>
等:其內容可以是任何內容。 寫List<Q>
表示它是一個包含Q
類型內容的List
。
List<Object[]>
和List<Object>
什么區別? []
是數組運算符。 List<Object[]>
是包含Object
數組的列表。 List<Object>
是包含Object
的列表。 在Java中, 幾乎所有東西都是一個Object
,包括數組!
這里還有另一件事要注意:Java泛型很復雜(而且很有趣),並且有一種叫做類型擦除的東西,這意味着在運行時, List<Object>
和List<XYZ>
都成為List
沒有特定的類型! 括號中的內容僅在編譯時使用-基本上是用來檢查您編寫的內容是否正確。 請參閱尖括號T在Java和Java泛型類型擦除中什么意思以及何時發生什么意思
為什么您的代碼運行? 好吧,在"A"
情況下很簡單。 在運行時,該參數只是一個List
,但是您的代碼希望在該列表中找到Object[]
,並且確實可以。 在"B"
情況下,情況更加復雜:參數只是一個List
,您遍歷其內容將其視為Object
。 這很好,因為如上所述(幾乎)所有內容都是Object
。 然后,您將這些對象轉換為String
-僅當我們不考慮在運行時輸入List
未輸入類型時,這才很奇怪。 就Java而言,該列表中可以包含任何內容,並且您告訴它存在String
。 因為輸入實際上是String
的列表,所以一切都可以解決。
有趣的一點(您的代碼中未包括)是如何調用一種方法,該方法將List<Object[]>
與List<String>
而在編譯時不會抱怨Java。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.