Kotlin 泛型的主要限制如下:
類型擦除:Kotlin 的泛型在編譯時會進行類型擦除,這意味著在運行時,泛型類型參數將被擦除,替換為其限定類型(無限定類型時,默認為 Object)。因此,運行時無法獲取泛型參數的具體類型。
不能創建參數化類型的數組:由于類型擦除,不能創建泛型參數化類型的數組,例如 T[] 數組。但可以使用數組列表(如 ArrayList
基本類型和數組作為泛型參數:Kotlin 不允許將基本類型(如 Int、Double 等)或數組作為泛型參數。但可以使用它們的包裝類(如 Integer、Double 等)或將數組作為泛型參數的約束。
協變和逆變:Kotlin 支持協變和逆變,但有一些限制。對于類類型,只支持協變(子類作為泛型參數)。對于接口類型,只支持逆變(父類作為泛型參數)。這有助于確保類型安全并避免在運行時出現 ClassCastException。
泛型約束:雖然 Kotlin 支持泛型約束,但相對于 Java,其約束能力較弱。可以使用 where
子句來添加泛型約束,但只能約束類型參數必須實現某個接口或繼承某個類。不能使用自定義類或函數作為約束。
可變參數和泛型:Kotlin 不支持將泛型類型參數用于可變參數(vararg)。如果需要使用可變參數,可以使用數組作為中間層,例如 fun <T> printArray(array: Array<T>)
。
泛型方法和泛型類:Kotlin 支持泛型方法和泛型類。泛型方法允許在方法級別上定義類型參數,而泛型類允許在類級別上定義類型參數。兩者都可以使用類型參數約束和協變/逆變。