軌道
/
Java
Java
/
課程大綱
/
泛型型別
泛型

泛型型別 在 Java

11 個練習

關於 泛型型別

泛型是一種對型別進行參數化的泛型類別或介面。這讓編譯器能對類別或介面強制執行型別安全。

來看看這個非泛型的Container介面:

class Container {
    private Object object;

    public void set(Object object) { this.object = object; }
    public Object get() { return object; }
}

由於它接受並回傳 Object 型別,因此能搭配任何非基本型別使用。不過這是有代價的,因為有些程式碼可能呼叫get並預期取得Integer,而其他程式碼卻呼叫set加入String,最後導致執行期例外。

泛型類別和泛型介面的格式如下:

class ClassName<T1, T2, ..., Tn> { ... }
interface InterfaceName<T1, T2, ..., Tn> { ... }

緊接在類別或介面名稱之後、由角括號(<>)包住的型別參數區段,用來指定型別參數(也稱為型別變數)T1、T2、...、Tn。這些型別參數可以在類別或介面的主體中使用,以獲得泛型的型別安全。

以下是Container的泛型版本:

class Container<E> {
    private E object;

    public void set(E object) { this.object = object; }
    public E get() { return object; }
}

建立時,我們現在必須宣告它要存放什麼型別,而編譯器會強制執行這項限制:

// empty <> can infer from context
Container<String> stringContainer = new Container<>();
// compiler knows this is a String, so it is allowed
stringContainer.set("Some string");
// no cast needed, compiler knows it is a String
String result = stringContainer.get();
// this causes a compiler error:
stringContainer.set(42);
透過 GitHub 編輯 連結會在新視窗或分頁中開啟

學習 泛型型別