Java泛型类型和对象类
我需要知道java泛型类型和对象类之间的区别。这里有两个代码,都很好,我只需要知道它们之间的区别: 程序1使用对象类: a包Java泛型类型和对象类,java,generics,generic-list,Java,Generics,Generic List,我需要知道java泛型类型和对象类之间的区别。这里有两个代码,都很好,我只需要知道它们之间的区别: 程序1使用对象类: a包 public class Generic { private Object[] datastore; private int size; private int pos; public Generic(int numEl) { size = numEl; pos = 0; datastore
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;
}
}
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;
}
}
公共类泛型{
私有对象[]数据存储;
私有整数大小;
私人国际邮政局;
公共通用(int-numEl){
大小=努美尔;
pos=0;
数据存储=新对象[大小];
}
公共无效添加(对象a){
数据存储[pos]=a;
pos++;
}
公共字符串toString(){
字符串元素=”;
对于(int i=0;igenerics是compile
时间概念,以确保类型安全
。在运行时
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
Generic-Generic=新的Generic(2);
generic.add(“test”);//编译器错误
generics是编译
时间概念,以确保类型安全
。在运行时
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
Generic-Generic=新的Generic(2);
generic.add(“test”);//编译器错误
由于Java中用于实现泛型的技术,这些代码片段在运行时没有区别
但是,在编译时,第二个代码段提供了更好的代码安全性
例如,它确保数组数据存储
中的所有对象具有相同的类型。第一个代码段允许您将不同类型的对象添加到数据存储
,因为所有对象都派生自对象
。但是,第二个代码段要求对添加
的所有调用都提供与ith typeT
,类的泛型类型参数。由于在Java中实现泛型所使用的技术,这些代码片段在运行时没有区别
但是,在编译时,第二个代码段提供了更好的代码安全性
例如,它确保数组数据存储
中的所有对象具有相同的类型。第一个代码段允许您将不同类型的对象添加到数据存储
,因为所有对象都派生自对象
。但是,第二个代码段要求对添加
的所有调用都提供与ith typeT
,类的泛型类型参数。当类型擦除开始时,编译器将所有参数替换为它的上限。例如:
类示例{}
将成为
class Example<Number> {}
类示例{}
如果使用边界定义参数,它将类似于:
class Example<T extends Number> {}
类示例{}
将成为
class Example<Number> {}
类示例{}
本质上,您的两个示例是通用的:一个具有预定义类型“Object”
,第二个使用T扩展对象
类型,它比第一个更具体、更安全。使用后者,可以避免不必要的强制转换当类型擦除
开始时,编译器会将所有参数替换为它的上限。例如:
类示例{}
将成为
class Example<Number> {}
类示例{}
如果使用边界定义参数,它将类似于:
class Example<T extends Number> {}
类示例{}
将成为
class Example<Number> {}
类示例{}
本质上,您的两个示例是通用的:一个具有预定义类型“Object”
,第二个带有T扩展对象
类型,该类型比第一个更具体、更安全。使用后者,您可以避免不必要的强制转换这是家庭作业吗?Google Java泛型。Sun/Oracle跟踪对该主题进行了大量的基本介绍。这是家庭作业吗?Google Java泛型Sun/Oracle trails对这个主题有很好的基本介绍。但是,很明显,只有当使用T作为对象进行实例化时,@TimBiegeleisen无论您提供的泛型类型如何,它在运行时都是相同的,而不仅仅是对象。泛型在编译时有助于类型安全。是的,我知道。那么您的意思是说,这两者之间的唯一区别是对于泛型类型,有一个安全开关,只允许输入特定类型的数据?是的,准确地说。您知道您希望用户输入的是字符串并存储在列表中。如果您不提供任何泛型参数或对象,则用户可以添加任何值(不仅仅是字符串)然后你的处理逻辑就会出错。为了防止这种情况发生,你需要使用泛型来启用类型安全性。但很明显,只有当用T作为对象实例化时,@TimBiegeleisen无论你提供的泛型类型如何,它在运行时都是一样的,而不仅仅是对象。泛型在编译时有助于类型安全性。是的,我知道。你是说假设这两者之间的唯一区别是,在泛型类型的情况下,有一个只允许输入特定类型数据的安全开关?是的,准确地说。您知道您希望用户输入的是字符串并存储在列表中。如果您不提供任何泛型参数或对象,则用户可以添加任何值(不仅仅是字符串)然后你的处理逻辑就会出错。为了防止它,你需要使用泛型来启用类型安全。