클래스나 함수를 정의할 때 타입을 확실히 정하지 않는 클래스

함수

fun <T> addNumbers(num1: T, num2: T): T {
    return (num1.toDouble() + num2.toDouble()) as T
}

→ 타입 T 변수 2개를 더해 타입 T 결과를 반환

fun main(args: Array<String>) {
    println(addNumbers(10, 20))      // 결과: 30
    println(addNumbers(10.1, 20.1))  // 결과: 30.200000000000003
}

→ 타입을 정하지 않았기 때문에 어떤 타입 인자로 전달될 수 있다

클래스

class Rectangle<T>(val width: T, val height: T) {
}

→ 타입 T Rectangle 클래스 정의

class Rectangle<T, K>(val width: T, val height: T, val name: K) {
}

→ 서로 다른 타입 2개를 선언하고 싶을 때 2개의 변수 선언

fun main(args: Array<String>) {
    val rec = Rectangle<Double>(10, 20)
    val rec1 = Rectangle<String>("aa", "bb")
}

→ 클래스를 생성

→ 코틀린은 타입을 추론하기 때문에 명시적으로 T를 작성할 필요는 없음

Constraint

class Rectangle<T: Number>(val width: T, val height: T) {
    fun getArea(): T {
        return (width.toDouble() * height.toDouble()) as T
    }
}

→ 특정 형식의 인자만 받도록 허용