14.1.1 內聯變量和泛型類型推斷
? 在聲明泛型變量時,聲明可能相當長。在創建該類型的對象時,必須重復相同的聲明。除非您利用內聯變量聲明及其變量類型推斷的能力。因此,上面最后一個代碼片段可以寫成:
beginvar Kvi := TKeyValue<Integer>.Create;try// ...finallyKvi.Free;end;
? 在這個代碼中,你不必兩次重復完整的泛型類型聲明。這在使用容器時特別方便,我們將在后面看到。
14.1.2 泛型類型的規則
? 當你聲明一個泛型類型的實例時,該類型會得到一個具體的版本,編譯器會在所有后續操作中使用該版本。因此,如果你有一個泛型類,比如:
typeTSimpleGeneric<T> = classValue: T;end;
當你聲明一個具體類型的對象時,你不能為 Value 字段指定不同的類型。鑒于以下兩個對象,下面的一些賦值(TypeCompRules 示例的一部分)是不正確的:
varSg1: TSimpleGeneric<string>;Sg2: TSimpleGeneric<Integer>;
beginSg1 := TSimpleGeneric<string>.Create;Sg2 := TSimpleGeneric<Integer>.Create;Sg1.Value := 'Foo';Sg1.Value := 10; // 錯誤// E2010 不兼容的類型:“string”和“Integer”Sg2.Value := 'Foo'; // 錯誤// E2010 不兼容的類型:“Integer”和“string”Sg2.Value := 10;
end;
? 一旦在泛型聲明中定義了具體類型,編譯器將強制執行對具體類型的檢查,這符合Object Pascal等強類型語言的預期。對于泛型對象作為整體,也適用類型檢查。當為對象指定泛型參數時,不能將一個不同且不兼容類型的相似泛型類型分配給它。如果這看起來令人困惑,下面的示例應該有助于澄清這個情況:
Sg1 := TSimpleGeneric<Integer>.Create; // 錯誤
// E2010 不兼容的類型:
// 'TSimpleGeneric<System.string>'
// 和 'TSimpleGeneric<System.Integer>'
? 正如我們將在 "通用類型兼容性規則 "一節中看到的,在這種特殊情況下,類型兼容性規則是按結構而不是按類型名制定的。一旦聲明了泛型類型,就不能再為其分配不同的、不兼容的類型。