Mobile Development
Kotlin
Subjective
Oct 04, 2025
Explain Kotlin generics, variance (in/out), and reified types.
Detailed Explanation
Generics provide type safety while maintaining flexibility. Variance controls subtyping relationships.\n\n**Basic generics:**\n\nclass Box(val value: T)\n\nfun identity(value: T): T = value\n\nval stringBox = Box("Hello")\nval intBox = Box(42)\n\n\n**Variance:**\n\n**Covariance (out) - Producer:**\n\ninterface Producer {\n fun produce(): T // Only produces T, never consumes\n}\n\nval stringProducer: Producer = object : Producer {\n override fun produce() = "Hello"\n}\nval anyProducer: Producer = stringProducer // OK - covariant\n\n\n**Contravariance (in) - Consumer:**\n\ninterface Consumer {\n fun consume(item: T) // Only consumes T, never produces\n}\n\nval anyConsumer: Consumer = object : Consumer {\n override fun consume(item: Any) = println(item)\n}\nval stringConsumer: Consumer = anyConsumer // OK - contravariant\n\n\n**Use-site variance:**\n\nfun copy(from: Array, to: Array) {\n for (i in from.indices) {\n to[i] = from[i]\n }\n}\n\n\n**Reified types (inline functions only):**\n\ninline fun isInstance(value: Any): Boolean {\n return value is T // T available at runtime\n}\n\ninline fun Gson.fromJson(json: String): T {\n return fromJson(json, T::class.java)\n}\n\n// Usage\nval isString = isInstance("Hello") // true\nval user = gson.fromJson(jsonString)\n\n\n**Type constraints:**\n\nfun > sort(list: List): List {\n return list.sorted()\n}\n\nfun cloneWhenGreater(list: List, threshold: T): List\n where T : Comparable, T : Cloneable {\n return list.filter { it > threshold }\n}\n\n\n**Star projection:**\n\nfun printList(list: List<*>) { // List\n for (item in list) {\n println(item)\n }\n}\n
Discussion (0)
No comments yet. Be the first to share your thoughts!
Share Your Thoughts