Java通用类型和对象类

时间:2015-04-12 15:01:06

标签: java generics generic-list

我需要知道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;
    }
}

3 个答案:

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