제네릭 타입을 정의하려면 클래스 이름 뒤에, 내부에 하나 이상의 제네릭 플레이스홀더(generic placeholder)5가 들어 있는 부등호(<>)를 추가한다.
예제 코드에서 T라는 플레이스홀더는 지금은 알 수 없는 어떤 타입을 대신하며, 제네릭 클래스 안에서는 일반 타입처럼 쓰인다.
IntroGenerics/GenericHolder.kt
package introgenerics
import atomictest.eq
class GenericHolder<T>( // [1]
private val value: T
) {
fun getValue(): T = value
}
fun main() {
val h1 = GenericHolder(Automobile("Ford"))
val a: Automobile = h1.getValue() // [2]
a eq "Automobile(brand=Ford)"
val h2 = GenericHolder(1)
val i: Int = h2.getValue() // [3]
i eq 1
val h3 = GenericHolder("Chartreuse")
val s: String = h3.getValue() // [4]
s eq "Chartreuse"
}
• [1] GeneriCHolder는 T 타입의 객체를 저장하며, 멤버 함수 getValue()는 T 타입의 값을 반환한다.
• [2], [3], [4]에서 getValue()를 호출할 때 결과 타입이 자동으로 올바른 타입으로 지정된다.