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
Uh oh!
There was an error while loading. Please reload this page.
-
변성이란 서로 다른 제네릭 타입 간의 상속 관계를 어떻게 다루는지를 말합니다.
변성의 종류
예시를 들면, 특정 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