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 类型,比第一个更具体和安全。使用后者,您可以避免不必要的转换