[英]Java Generic Type and Object Class
我需要知道java泛型類型和Object類之間的區別。 這是兩個代碼,都可以正常工作,我只需要知道它們之間的區別是什么:
程序1使用對象類:包a;
public class Generic {
private Object[] datastore;
private int size;
private int pos;
public Generic(int numEl) {
size = numEl;
pos = 0;
datastore = new Object[size];
}
public void add(Object a){
datastore[pos] = a;
pos++;
}
public String toString(){
String elements ="";
for (int i=0; i<pos; i++) {
elements += datastore[i] + " ";
}
return elements;
}
}
程序2使用泛型類型:
public class Generic<T> {
private T[] datastore;
private int size;
private int pos;
public Generic(int numEl){
size = numEl;
pos = 0;
datastore = (T[]) new Object[size];
}
public void add(T a) {
datastore[pos] = a;
pos++;
}
public String toString(){
String elements ="";
for (int i=0; i<pos; i++) {
elements += datastore[i] + " ";
}
return elements;
}
}
Genercis是compile
時間概念,以確保type safety
。 在runtime
private T[] datastore;
將被解釋為
private Object[] datastore;
所以你可以說
Generic generic = new Generic(2);
generic.add("test"); //allowed
但是你不能說
Generic<Integer> generic = new Generic<Integer>(2);
generic.add("test"); // compiler error
由於使用Type Erasure ,該技術用於在Java中實現泛型,因此這些代碼段在運行時沒有區別。
但是,在編譯時,第二個代碼段提供了更好的代碼安全性。
例如,它確保數組datastore
內的所有對象都具有相同的類型。 第一個代碼段使您可以將不同類型的對象添加到datastore
,因為所有對象都源自Object
。 但是,第二個代碼段要求add
所有調用都必須提供與類型T
兼容的對象,類型T
是該類的通用類型參數。
當type erasure
開始時,編譯器會將所有參數替換為其上限。 例如:
class Example<T> {}
會變成
class Example<Object> {}
如果您定義帶邊界的參數,它將是這樣的:
class Example<T extends Number> {}
會變成
class Example<Number> {}
從本質上講,您的兩個示例是通用的:一個示例具有預定義的類型"Object"
,第二個示例具有T extends Object
類型,這比第一個示例更為具體和安全。 使用后者,可以避免不必要的強制轉換
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.