Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型类型和对象类_Java_Generics_Generic List - Fatal编程技术网

Java泛型类型和对象类

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

我需要知道java泛型类型和对象类之间的区别。这里有两个代码,都很好,我只需要知道它们之间的区别:

程序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;
    }
}
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 type
T
,类的泛型类型参数。

由于在Java中实现泛型所使用的技术,这些代码片段在运行时没有区别

但是,在编译时,第二个代码段提供了更好的代码安全性


例如,它确保数组
数据存储
中的所有对象具有相同的类型。第一个代码段允许您将不同类型的对象添加到
数据存储
,因为所有对象都派生自
对象
。但是,第二个代码段要求对
添加
的所有调用都提供与ith type
T
,类的泛型类型参数。

类型擦除开始时,编译器将所有参数替换为它的上限。例如:

类示例{}

将成为

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无论你提供的泛型类型如何,它在运行时都是一样的,而不仅仅是对象。泛型在编译时有助于类型安全性。是的,我知道。你是说假设这两者之间的唯一区别是,在泛型类型的情况下,有一个只允许输入特定类型数据的安全开关?是的,准确地说。您知道您希望用户输入的是字符串并存储在列表中。如果您不提供任何泛型参数或对象,则用户可以添加任何值(不仅仅是字符串)然后你的处理逻辑就会出错。为了防止它,你需要使用泛型来启用类型安全。