簡體   English   中英

列表之間的區別<Object>並列出

[英]Difference between List<Object> and List

這幾行有什么區別:

List<Object> list = new ArrayList<Object>();

List list = new ArrayList();

據我了解,一切都是對象,當您只列出列表時,您剛剛提到了這一點。

最終這兩種說法都是一樣的。 在這種情況下沒有區別,因為 java 中的每個類都擴展了 Object。

如果您使用Object以外的任何特定對象,您會看到不同之處。

例如:

List<String>  vs List

實際上沒有區別,它們都編譯成完全相同的代碼。

List<Object>雖然表明您已經考慮過列表中將包含的內容並且知道它可以是任何內容,而List本身卻沒有顯示任何內容。

Java 一直非常擅長保持其版本之間的向后兼容性。 有人會說,太好了;)

添加泛型后,Sun 付出了很多努力,使以前版本的 Java 以相同的方式工作。 他們還確保泛型是 Java 編譯器的一部分,而不是 JVM。 所以一些奇怪的東西顯示出來了,這就是其中之一。

結果是兩者實際上是相同的。 一切都以 Java 語言版本的向后兼容性為名。

雖然您不會看到List / ArrayList本身的行為方式有什么不同,但原始類型的使用可能會影響程序的其他區域,因為所有涉及相關代碼的通用檢查都會被跳過。

這個問題為例。 從接受的答案:

public class Test {
    public static void main(String[] args) {
        String s;

        // this compiles
        s = new Generic<Object>().get();
        // so does this
        s = new Generic<Object>().<String>get();

        // this doesn't compile
        s = new Generic().get();
        // neither does this
        s = new Generic().<String>get();
    }
}

class Generic<A> {
    <B> B get() { return null; }
}

請注意,當類Generic使用<Object>參數化時,您可以很好地編譯代碼,但是當您使用原始類型時,Generic聲明的不相關的泛型類型B也會被刪除,從而導致編譯時錯誤,因為Object可以' t 分配給String

所以有區別的-使用原始類型時,你沒有得到任何檢查。 如果使用<Object> ,編譯器仍將在代碼的其他部分執行類型檢查。

只有傻瓜的區別。 使用List<Object>和非泛型List是愚蠢的,因為你打算用它做什么?

通常,您使用List對相關項進行分組,然后以某種方式遍歷它們並執行一些常見操作或為每個項提取一些常見信息。

這至少有一定的意義:

List<Car> cars = getMeTheCars();
for(Car c : cars) {
    System.out.println(c.getName() + " is a car.");
}

如果你的列表中有一堆不同的、不相關的類型,你會得到這樣的可怕的東西:

List<Object> obs = getMeTheObjects();
for(Object o : obs) {
    if(o instanceof String) { ... }
    if(o instanceof DateTime) { ... }
    if(o instanceof Integer) { ... }
    if(o instanceof Double) { ... }
    if(o instanceof Decimal) { ... }
    if(o instanceof SomeWeirdCustomClass) { ... }
    if(o instanceof SomeOtherClass) { ... }
}

基本上只有類型不同。 當您使用 List Object 時,您使用的是 Object 類型(在本例中)。 當您不說列表將默認為 RAW 類型時。 希望這可以幫助。

List是Rawtype是不完全一樣的東西List<Object> 正如已經提到的List是 Java 遺留代碼,並且由於向后兼容性是 Java 中的一個主要問題,因此仍然允許使用諸如List之類的原始類型,而List<Object>是一個對象列表。 如果您在兩個對象上使用List類方法,您會注意到它們的行為方式相同,沒有區別。 但是如果你嘗試在 JDK 8+ 中做這樣的事情,例如:

List<Object> objects = new ArrayList<>();
List<String> strings = objects; //Compilation error

你會得到一個編譯器錯誤,而下面的代碼工作正常:

List raws = new ArrayList();
List<String> string = raws; // No compilation errors

例如,第二個示例適用於維護使用List的遺留代碼的人。 他們可以影響它到具體的類並使用它們而不是繼續使用 Rawtype 類。

來自 java 文檔

為了方便與非通用遺留代碼的接口,可以將參數化類型(第 4.5 節)的擦除(第 4.6 節)或元素類型為參數化類型的數組類型(第 10.1 節)的擦除用作類型. 這種類型稱為原始類型。

ListList<T>之間的區別是:

  1. List是原始類型,因此可以包含任何類型的對象,而List<T>可以包含類型 T 或 T 的子類型的對象。
  2. 我們可以將任何類型的列表對象分配給原始類型List引用變量,而我們只能將<T>類型的列表對象分配給List<T>類型的引用變量。例如:
 List list=new ArrayList();                         //works fine
 List<String> list1=new ArrayList();                //works fine
 List<Animal> animals=new ArrayList<Animal>();      //works fine 
 List<Animal> dogs=new ArrayList<Dog>();            // compile-time error

列表,列表之間的區別<!--?--> , 列表<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[]> 和清單 <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 <Object>和List <?>之間有什么區別 List和List之間的Java差異<Object> List和Enumeration之間的區別 清單項目之間的差異 List和Array之間的區別 我應該如何獲得2個清單之間的區別<Object> Groovy-List、ArrayList 和 Object Array 的區別 Query .list和.getResultList之間的區別
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM