<>
괄호 안에 하나 이상 정의할 수 있음.Type | Full name | desc |
---|---|---|
T | Type | 일반적으로 사용되는 타입 매개변수 |
E | Element | 주로 Collection 요소의 타입을 나타내는 매개변수 |
K | Key | 맵Map 에서 키의 타입을 나타내는 매개변수 |
V | Value | 맵Map 에서 값의 타입을 나타내는 매개변수 |
N | Number | 숫자 타입을 나타내는 매개변수 |
R | Return | 반환 타입을 나타내는 매개변수 |
S, U, V 등 | 여러 개의 타입 매개변수가 필요한 경우, 추가적으로 사용될 수 있는 일반적인 알파벳 |
:
뒤에 특정 자료형 설정where
키워드 설정fun <T> useAndClose(input: T) where T: AutoCloseable, T: Appendable {
input.append("there")
input.close()
}
fun main() {
println(1) // 1
prefixPrint(1) // prefixed 1
}
fun <T> prefixPrint(obj: T) = println("prefixed " + obj.toString())
fun main() {
PrefixPrint(1) // prefixed 1
}
class PrefixPrint<T>(val obj: T){
init{
println("prefixed " + obj.toString())
}
}
fun main() {
PrefixPrint(1) // prefixed 1
}
interface Prefixed<T> {
fun getPrefixed(obj: T): String
}
class PrefixPrint<T>(val obj: T): Prefixed<T>{
init{
println(getPrefixed(obj))
}
override fun getPrefixed(obj: T) = "prefixed $obj"
}
따로 지정해주지 않으면 기본적으로 모든 Generic Class는 불변성(무공변성)이다.
따라서 해당 제네릭에 매칭되는 자료형만 대체되어 처리된다
제네릭 타입에 대해서 상속관계까지 처리하려면 변성(variance)을 지정해야함
종류로는 불변성(Invariance), 공변성(Covariance), 반공변성(Contravariance)의 세 가지가 존재
fun main() {
val intObj: PrefixPrint<Int> = PrefixPrint<Int>(1) // prefixed 1
// error by Type Mismatch
// val anyObj: PrefixPrint<Any> = PrefixPrint<Int>(1)
}
class PrefixPrint<T>(val obj: T){
init{
println("prefixed " + obj.toString())
}
}
out
키워드를 사용하여 설정in
키워드를 사용하여 설정