簡體   English   中英

List和有什么不一樣 <Object[]> 和清單 <Object> ?

[英]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>

只是想知道任何人都可以對它如何工作進行一些解釋。

所以依次回答:

  1. 對於Java中的泛型, List<something>真正含義是什么? 使用<>括號符號可以指定所需的泛型類的特定類型 基本上, List可以是List<A>List<B>等:其內容可以是任何內容。 List<Q>表示它是一個包含Q類型內容的List

  2. List<Object[]>List<Object>什么區別? []是數組運算符。 List<Object[]>是包含Object數組的列表。 List<Object>是包含Object的列表。 在Java中, 幾乎所有東西都是一個Object ,包括數組!

這里還有另一件事要注意:Java泛型很復雜(而且很有趣),並且有一種叫做類型擦除的東西,這意味着在運行時, List<Object>List<XYZ>都成為List沒有特定的類型! 括號中的內容僅在編譯時使用-基本上是用來檢查您編寫的內容是否正確。 請參閱尖括號T在JavaJava泛型類型擦除中什么意思以及何時發生什么意思


為什么您的代碼運行? 好吧,在"A"情況下很簡單。 在運行時,該參數只是一個List ,但是您的代碼希望在該列表中找到Object[] ,並且確實可以。 "B"情況下,情況更加復雜:參數只是一個List ,您遍歷其內容將其視為Object 這很好,因為如上所述(幾乎)所有內容都是Object 然后,您將這些對象轉換為String -僅當我們不考慮在運行時輸入List未輸入類型時,這才很奇怪。 就Java而言,該列表中可以包含任何內容,並且您告訴它存在String 因為輸入實際上是String的列表,所以一切都可以解決。

有趣的一點(您的代碼中未包括)是如何調用一種方法,該方法將List<Object[]>List<String>而在編譯時不會抱怨Java。

列表,列表之間的區別<!--?--> , 列表<t> , 列表<e> , 和列表<object><div id="text_translate"><p> <strong>List 、 List<?> 、 List<T> 、 List<E>和List<Object>之間有什么區別?</strong></p><h1> 1.清單</h1><p> List :是原始類型,因此不是typesafe的。 它只會在轉換錯誤時產生運行時錯誤。 當轉換錯誤時,我們希望出現編譯時錯誤。 不推薦使用。</p><h1> 2.列表<?></h1><p> List<?>是一個無限通配符。 但我不確定它的用途是什么? 我可以毫無問題地打印一個List<?> :</p><pre> public static void test(List<?> list){ System.out.println(list); // Works }</pre><p> <strong>為什么我不能將項目添加到List<?> ?</strong></p><pre> public static void test(List<?> list){ list.add(new Long(2)); // Error list.add("2"); // Error System.out.println(list); }</pre><h1> 3.列表<T></h1><pre> public static void test(List<T> list){ // T cannot be resolved System.out.println(list); }</pre><p> 我不明白這種語法。 我看到了這樣的東西,它有效:</p><pre> public <T> T[] toArray(T[] a){ return a; }</pre><p> <strong>有時,我會看到<T>或<E>或<U> 、 <T,E> 。</strong> <strong>它們都是一樣的還是代表不同的東西?</strong></p><h1> 4. 列表<對象></h1><p> 這給出了錯誤“方法test(List<Object>)不適用於參數List<String> ”:</p><pre> public static void test(List<Object> list){ System.out.println(list); }</pre><p> 如果我嘗試這個然后我得到“無法從List<String>投射到List<Object> ”:</p><pre> test((List<Object>) names);</pre><p> 我很迷惑。 <strong>String是Object的子類,那么為什么List<String>不是 List List<Object>的子類?</strong></p></div></object></e></t>

[英]Difference between List, List<?>, List<T>, List<E>, and List<Object>

暫無
暫無

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

相關問題 List <Object>和List <?>之間有什么區別 列表之間的區別<Object>並列出 列表,列表之間的區別<!--?--> , 列表<t> , 列表<e> , 和列表<object><div id="text_translate"><p> <strong>List 、 List<?> 、 List<T> 、 List<E>和List<Object>之間有什么區別?</strong></p><h1> 1.清單</h1><p> List :是原始類型,因此不是typesafe的。 它只會在轉換錯誤時產生運行時錯誤。 當轉換錯誤時,我們希望出現編譯時錯誤。 不推薦使用。</p><h1> 2.列表<?></h1><p> List<?>是一個無限通配符。 但我不確定它的用途是什么? 我可以毫無問題地打印一個List<?> :</p><pre> public static void test(List<?> list){ System.out.println(list); // Works }</pre><p> <strong>為什么我不能將項目添加到List<?> ?</strong></p><pre> public static void test(List<?> list){ list.add(new Long(2)); // Error list.add("2"); // Error System.out.println(list); }</pre><h1> 3.列表<T></h1><pre> public static void test(List<T> list){ // T cannot be resolved System.out.println(list); }</pre><p> 我不明白這種語法。 我看到了這樣的東西,它有效:</p><pre> public <T> T[] toArray(T[] a){ return a; }</pre><p> <strong>有時,我會看到<T>或<E>或<U> 、 <T,E> 。</strong> <strong>它們都是一樣的還是代表不同的東西?</strong></p><h1> 4. 列表<對象></h1><p> 這給出了錯誤“方法test(List<Object>)不適用於參數List<String> ”:</p><pre> public static void test(List<Object> list){ System.out.println(list); }</pre><p> 如果我嘗試這個然后我得到“無法從List<String>投射到List<Object> ”:</p><pre> test((List<Object>) names);</pre><p> 我很迷惑。 <strong>String是Object的子類,那么為什么List<String>不是 List List<Object>的子類?</strong></p></div></object></e></t> List和List之間的Java差異<Object> 聲明ArrayList對象和List對象在時間和空間復雜度上有什么區別? 在LinkedList中,:list.add(…)和object.list.add(…)有什么區別? 集合和列表有什么區別? Groovy-List、ArrayList 和 Object Array 的區別 我應該如何獲得2個清單之間的區別<Object> List 和 List 有什么區別<Integer[]>並列出<List<Integer> &gt; 在 Java 中
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM