簡體   English   中英

Java通用類型和對象類

[英]Java Generic Type and Object Class

我需要知道java泛型類型和Object類之間的區別。 這是兩個代碼,都可以正常工作,我只需要知道它們之間的區別是什么:

程序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使用泛型類型:

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兼容的對象,類型T是該類的通用類型參數。

type erasure開始時,編譯器會將所有參數替換為其上限。 例如:

class Example<T> {}

會變成

class Example<Object> {}

如果您定義帶邊界的參數,它將是這樣的:

class Example<T extends Number> {} 

會變成

class Example<Number> {}

從本質上講,您的兩個示例是通用的:一個示例具有預定義的類型"Object" ,第二個示例具有T extends Object類型,這比第一個示例更為具體和安全。 使用后者,可以避免不必要的強制轉換

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM