제네릭

타입 매개변수와 타입 인자를 지정하는 위치

제네릭 함수

fun main() {
    println(add(1, 2) { x, y -> x + y })
    println(add("1", "2") { x, y -> x + y })
}

fun <T> add(x: T, y: T, op: (T, T) -> T): T = op(x, y)

실행결과
3
12

타입 매개변수의 매개변수와 반환 자료형 분리

fun main() {
    println(sum(1, 2) { x, y -> "${(x + y)}!!!"})
    println(sum(1, 2) { x, y -> (x + y).toDouble()})
}

fun <T, R> sum(x: T, y: T, op:(T, T) -> R): R = op(x, y)

실행결과
3!!!
3.0

타입 매개변수에 특정 자료형을 제한하기

import java.lang.Appendable

fun main() {
    sumA("2", "1") { x, y -> x + y } // 에러 숫자 타입만 처리 가능
    sumA(2, 1) { x, y -> x + y }  // ok
    val name = StringBuilder("사랑하자!")
    suffix(name)
    println(name) // 사랑하자! 코틀린
}

fun <T: Number> sumA(x: T, y: T, action: (T, T) -> T): T = action(x, y)
fun <T> suffix(str: T) where T: CharSequence, T: Appendable {
    str.append("코틀린")
}