Kotlin generics

2025. 10. 2. 09:30Programming/JAVA, C++, Go, Rust

    목차
반응형

Grammar

class

다음 예에서 T는 타입 파라미터이며 Box 클래스가 어떤 타입이던 속성으로 지닐 수 있게 합니다.

class Box<T>(val value: T) {
    fun getValue(): T = value
}

다음과 같이 사용할 수 있습니다.

val intBox = Box<Int>(123)
val strBox = Box<String>("123")

println(intBox.getValue())  // 123
println(strBox.getValue())  // 123

다음과 같이 타입추론도 가능합니다.

val intBox = Box(123)

where clause

여러 타입 파라미터에 복합 제약을 주거나, 하나의 타입 파라미터에 여러 제약을 줄 때 사용합니다.

다음 예에서 T는 CharSquence를 구현하고, R은 Appendable을 구현해야 합니다.
ex.

fun <T, R> copy(from: T, to: R) where T: CharSequence, R: Appendable {
    to.append(from)
}

다음의 경우 두 조건을 모두 만족해야 합니다.즉, T는 비교 가능하면서 직렬화도 가능한 타입이어야 합니다.
이렇게하면 holder 내부에서 v.compareTo(other)와 같은 호출이나 직렬화 관련 작업을 안전하게 컴파일 타임에 보장받을 수 있습니다.

class Holder(val v: T) where T: Comparable, T: java.io.Serializable

다음 두 구문은 같은 의미입니다.

fun <T, R> copy(from: T, to: R) where T : CharSequence, R : Appendable { ... }
fun <T : CharSequence, R : Appendable> copy(from: T, to: R) { ... }

둘 다 T는 CharSequence 혹은 그 하위 타입 이어야 하고, R은 Appendable 혹은 그 하위 타입 이어야 한다는 의미입니다.
이렇게 타입을 제한하면 함수 내부에서 CharSequence의 멤버인 length() 등을 안전하게 사용할 수 있습니다.

function

Type deduction

fun <T> singletonList(item: T): List<T> {
    return listOf(item)
}

val alist = singletonList(123)  // List<Int>

특정 타입으로 제한

특정 타입으로 제네릭을 제한하려면, where 구문 혹은 :을 사용합니다.
다음은 Number를 상속하는 타입만 허용합니다.

fun <T: Number> half(value: T): Double {
    return value.toDouble() / 2
}

Covariance / Contravariance

  • out: 공변성, 타입 매개변수를 "생산자" 용도로 사용
    • ex.
        Producer<out T>
  • in: 반공변성. 타입 매개변수를 "소비자" 용도로 사용
    • ex.
        Consumer<in T>
interface Producer<out T> {
    fun produce(): T
}

interface Consumer<in T> {
    fun consume(item: T)
}

smart cast

제네릭 타입 변수에 대해서는 직접 타입 체크 및 스마트캐스트가 불가능 합니다.

fun <T> isString(value: T): Boolean {
    return value is String
}
반응형

'Programming > JAVA, C++, Go, Rust' 카테고리의 다른 글

Kotlin: Function with receivers  (0) 2025.10.02
backtrace 정보 출력  (0) 2025.03.31
go get 오류 발생 시 대처  (0) 2024.05.09
go profiler pprof 사용법  (0) 2024.02.06
Study stuff for Golang  (0) 2023.07.24