Replies: 1 comment
-
무공변 : A 가 B 의 서브 타입이라고 해도, List 는 List 의 서브 타입이 아니다. declaration-site variance interface Producer<out T> { // Covariant
fun produce(): T
}
interface Consumer<in T> { // Contravariant
fun consume(item: T)
} user-site variance fun <T> consumeProducer(producer: Producer<out T>) { /*...*/ }
fun <T> produceConsumer(consumer: Consumer<in T>) { /*...*/ } java 는 user-site variance 만을 제공한다. |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
변성이란 서로 다른 제네릭 타입 간의 상속 관계를 어떻게 다루는지를 말합니다.
변성의 종류
예시를 들면, 특정 class 가 Flow 처럼 Producer 일 경우 out 키워드를 사용하고, FlowCollector 와 같이 Consumer 의 역할을 할 경우 in 키워드를 사용합니다.
java 는 선언 지점 변성 만을 제공하기 때문에, 변성을 지정하는 모든 곳에서 변성을 지정해야합니다.
반면, Kotlin 은 사용 지점 변성 을 지원하기 때문에, 변성을 지정하는 곳에서만 변성을 지정하면 되기 때문에 훨씬 간결하게 사용할 수 있습니다.
참고) out, in 키워드는 private class, 메서드에 대해서는 사용할 수 없다.
참고) java 는 Stream api를 보면 거의 모든 곳에서 ? extends, ? super 를 사용하여 변성을 지정한다.
Kotlin 은 기본적으로 제공하는 Function 에 in, out 키워드로 변성을 지정되어 사용할 때 훨씬 간결하게 사용할 수 있다.
자바 vs 코틀린 변성
Kotlin의 장점은 변성을 미리 지정할 수 있어 코드가 더 명확하고 안전하게 작성될 수 있다.
참고 블로그
Beta Was this translation helpful? Give feedback.
All reactions