Kotlin generics resemble Java and C# type parameters but add declaration-site variance (out, in) and reified types with inline functions.
Variance
interface Producer<out T> {
fun produce(): T
}
out T is covariant (producer); in T is contravariant (consumer). Use where Java wildcards feel awkward.
Constraints and star projection
fun <T : Comparable<T>> sort(list: List<T>) bounds types. List<*> is an unknown element type—read-only for out, write caveats for in.
Important interview questions and answers
- Q: out vs in?
A:outmeans you only return T (covariant);inmeans you only consume T (contravariant). - Q: Reified type parameters?
A: Available withinlinefunctions—type info preserved at runtime forT::classchecks in the same function.
Self-check
- Which variance keyword marks a producer interface?
- What does List<*> mean?
Tip: Use out for producers and in for consumers—Pecs (producer extends, consumer super) in Kotlin form.
Interview prep
- out vs in?
out producer (read), in consumer (write parameters).
- reified?
Inline generics retain type at runtime in inlined functions.