Java 通用类型和对象 Class
Java Generic Type and Object Class
我需要知道 java 通用类型和对象 class 之间的区别。这里有两个代码,都可以正常工作,我只需要知道它们之间的区别:
程序 1 使用对象 Class:
套餐一;
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
兼容的对象,class.
的泛型类型参数
当 type erasure
开始时,编译器将所有参数替换为它的上限。例如:
class Example<T> {}
会变成
class Example<Object> {}
如果你用边界定义参数,它将是这样的:
class Example<T extends Number> {}
会变成
class Example<Number> {}
本质上,您的两个示例是通用的:一个具有预定义类型 "Object"
,第二个具有 T extends Object
类型,比第一个更具体和安全。使用后者,您可以避免不必要的转换
我需要知道 java 通用类型和对象 class 之间的区别。这里有两个代码,都可以正常工作,我只需要知道它们之间的区别:
程序 1 使用对象 Class: 套餐一;
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
兼容的对象,class.
当 type erasure
开始时,编译器将所有参数替换为它的上限。例如:
class Example<T> {}
会变成
class Example<Object> {}
如果你用边界定义参数,它将是这样的:
class Example<T extends Number> {}
会变成
class Example<Number> {}
本质上,您的两个示例是通用的:一个具有预定义类型 "Object"
,第二个具有 T extends Object
类型,比第一个更具体和安全。使用后者,您可以避免不必要的转换