Setelah mengetahui contoh bagaimana generic bekerja pada sebuah kelas, selanjutnya kita akan mempelajari bagaimana penerapan generic itu sendiri. Kita bisa menerapkannya dengan meletakkan tipe parameter ke dalam angle brackets (<>) seperti berikut:

1. interface List<T>{ 2.     operator fun get(index: Int) : T 3. }

Pada kode di atas, tipe parameter T bisa kita gunakan sebagai tipe reguler yang mengembalikan tipe dari sebuah fungsi.

Selanjutnya, jika kita mempunyai sebuah kelas yang mewarisi kelas atau interface generic, maka kita perlu menentukan tipe argumen sebagai tipe dasar dari parameter generic kelas tersebut. Parameternya bisa berupa tipe yang spesifik atau lainnya. Contohnya seperti berikut:

1. class LongList : List<**Long**>{ 2.     override fun get(index: Int): **Long** { 3.         return this[index] 4.     } 5. } 6.   7. class ArrayList**<T>** : List**<T>**{ 8.     override fun get(index: Int): **T** { 9.       return this[index] 10.     } 11. }

Pada kelas LongList di atas, Long digunakan sebagai tipe argumen untuk List, sehingga fungsi yang berada di dalamnya akan menggunakan Long sebagai tipe dasarnya. Berbeda dengan kelas ArrayList, di mana tipe argumen untuk kelas List menggunakan T. Dengan demikian ketika kita menggunakan kelas ArrayList, kita perlu menentukan tipe argumen dari kelas tersebut saat diinisialisasi.

1. fun main() { 2.     val longArrayList = ArrayList<Long>() 3.     val firstLong = longArrayList.get(0) 4. } 5.   6. class ArrayList<T> : List<T> { 7.     override fun get(index: Int): T { 8.         return this[index] 9.     } 10. } 11.   12. interface List<T> { 13.     operator fun get(index: Int): T 14. }

Yang perlu diperhatikan dari kelas ArrayList di atas adalah deklarasi dari tipe parameter T. Tipe parameter tersebut berbeda dengan yang ada pada kelas List, karena T adalah milik kelas ArrayList itu sendiri. Plus sebenarnya Anda pun bisa menggunakan selain T misalnya seperti berikut:

1. class ArrayList<T> : List<T> { 2.     override fun get(index: Int): T { 3.         return this[index] 4.     } 5. } 6.   7. interface List<**P**> { 8.     operator fun get(index: Int): **P** 9. }