[英]What is the difference between List<Object[]> and List<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 節)的擦除用作類型. 這種類型稱為原始類型。
List
和List<T>
之間的區別是:
List
是原始類型,因此可以包含任何類型的對象,而List<T>
可以包含類型 T 或 T 的子類型的對象。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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.