我需要知道java Generic类型和Object类之间的区别。这里有两个代码,两者都很好,我只需要知道它们之间有什么区别:
使用Object Class的程序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: 包a;
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;
}
}
答案 0 :(得分:2)
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
答案 1 :(得分:2)
由于Type Erasure是用于在Java中实现泛型的技术,因此在运行时这些代码片段之间没有区别。
但是,在编译时,第二个代码片段提供了更好的代码安全性。
例如,它确保数组datastore
内的所有对象具有相同的类型。第一个代码段允许您将不同类型的对象添加到datastore
,因为所有对象都派生自Object
。但是,第二个代码段要求对add
的所有调用都提供与类T
兼容的对象,类型的泛型类型参数。
答案 2 :(得分:0)
当type erasure
开始时,编译器会将所有参数替换为它的上限。例如:
class Example<T> {}
将成为
class Example<Object> {}
如果使用bounds定义参数,则类似于:
class Example<T extends Number> {}
将成为
class Example<Number> {}
基本上,您的两个示例是通用的:一个具有预定义类型"Object"
,另一个具有T extends Object
类型,它比第一个更具体和安全。使用后者,您可以避免不必要的强制转换