Kotlin generics
2025. 10. 2. 09:30ㆍProgramming/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>
- ex.
- in: 반공변성. 타입 매개변수를 "소비자" 용도로 사용
- ex.
Consumer<in T>
- ex.
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 |