tonykang22 / study

0 stars 0 forks source link

[Kotlin & Spring] 06. 제네릭 #115

Open tonykang22 opened 1 year ago

tonykang22 commented 1 year ago

제네릭

코틀린의 제네릭

class MyGenerics<T>(val t: T)


fun main() {
        val generics = MyGenerics<String>("테스트")
}


val generics = MyGenerics("테스트")


val list1: MutableList<String> = mutableListOf()
val list2 = mutableListOf<String>()


val list: List<*> = listOf<String>("테스트")



변성


공변성

fun main() { val generics = MyGenerics("테스트")

    val charGenerics : MyGenerics<CharSequence> = generics // 컴파일 오류

}


<br>

- 변경 후
    * 공변성은 CharSequence가 String의 상위 타입일때 `MyGenerics<CharSequence>`가 `MyGenerics<String>`의 상위 타입이므로 공변성이다.
``` kotlin
class MyGenerics<out T>(val t: T)

fun main() {
        val generics = MyGenerics<String>("테스트")

        val charGenerics : MyGenerics<CharSequence> = generics
}



반공변성

fun main() { val bag = Bag()

    // in이 없다면 컴파일 오류
    bag.saveAll(mutableListOf<CharSequence>(""), mutableListOf<String>(""))

}


<br><br>

- 변경 후
    * 공변성과는 반대로 String이 CharSequence의 하위 타입일 때 Bag<String>가 Bag<CharSequence>의 상위 타입이 되므로 반공변성이다.
    * 기본은 무공변성으로써 in,out 어떤 것도 지정하지 않은 경우
        * String은 CharSequence의 하위 타입이지만 MyGenerics<String>와 MyGenerics<CharSequence>는 아무런 관계도 아니다.
        * 이것이 무공변성이다.
``` kotlin
class Bag<T> {

        fun saveAll(
                to: MutableList<in T>,
                from : MutableList<in T>,
        ) {
                to.addAll(from)
        }
}

fun main() {
        val bag = Bag<String>()

        bag.saveAll(mutableListOf<CharSequence>(""), mutableListOf<String>(""))

}