자바와 다르게 코틀린은 raw 타입을 허용하지 않으므로 제네릭 타입의 타입인자를 컴파일러가 알 수 있게 해줘야 한다.
자바는 맨 처음에 제네릭 지원이 없었고, 자바 1.5에 뒤늦게 제네릭을 도입했기 때문에 이전 버전과 호환성을 유지하기 위해 타입 인자가 없는 제네릭 타입(raw 타입)을 허용한다.
제네릭의 기본적인 특징은 자바랑 대부분 동일하다.
// 타입 파라미터에 여러 제약을 가할 수 있다.
// T 타입은 반드시 CharSequence와 Appendable을 구현한 구현체여야 한다.
fun <T> ensureTrailingRerioid(seq: T)
where T : CharSequence, T : Appendable {
if (!seq.endsWith('.')) {
seq.append('.')
}
}
// 타입파라미터는 nullable하므로 null 불가능하게 막을 수 있다.
fun <T : Any> test(t: T): Nothing = TODO()
stringList is List
**와 같이 제네릭 타입을 제외하고 검사 하지만 코틀린은 제네릭 클래스에 반드시 제네릭 타입을 명시해야 한다.stringList is List<*>
**와 같이 star projection을 활용할 수 있으며 런타임에 타입 정보를 알수있도록 inline, reified를 활용하면 **stringList is List<String>
**와 같이 타입 검사가 가능하다.// inline 함수와 reified를 활용하면 실체화된 타입으로 취급할 수 있다.
inline fun <reified T> isA(value: Any) = value is T
fun main() {
println(isA<String>(1)) // false
println(isA<String>("1")) // true
// 실체화된 타입을 활용할 수 있는 예(원하는 타입의 원소만 가져옴)
val items = listOf(1, "2", 3)
println(items.filterIsInstance<Int>())
}