작성
·
51
답변 3
0
아하~ Cage4를 이용한 예시가 궁금하셨군요! 🙂
class Cage4<T> {
private val animals: MutableList<T> = mutableListOf()
fun put(animal: T) {
this.animals.add(animal)
}
}
Cage3와 다르게 역으로 Cage4<GoldFish> 타입의 변수에 Cage4<Fish> 타입의 변수를 assign 할 수 있는지를 생각해보시면 좋을 것 같습니다.
현재 Cage4 <T> 에는 반공변성 지시어인 in
이 없기 때문에
val fishCage = Cage4<Fish>()
fishCage.put(Carp("잉어"))
val goldFishCage: Cage4<GoldFish> = fishCage
아래 코드는 당연히 에러가 날거에요! Cage4<Fish>
와 Cage4<GoldFish>
는 다른 타입이니까요 🙂
하지만 만약 in
을 추가해주면~ Cage 입장에서는 내부 T 타입을 받기만하기 때문에 Fish Cage에 GoldFish가 들어와도 사실은 문제가 없고~ 따라서 위 코드의 에러가 사라지게 될거에요!
공변 / 반공변이 상당히 어려운 개념이라 이런게 있구나~ 정도로 이해하시고 실제 실무 환경에서 라이브러리나 프레임워크를 열어볼 때 어떤 코드에 어떻게 적용되어 있는지 관찰하시면 조금 더 이해도를 높이실 수 있을거에요!! 감사합니다~!!!
0
0
안녕하세요! 🙂 데이터를 소비만 하는 반공변한 클래스의 대표적인 예시로는
Comparable이 있습니다. Comparable<in T>
처럼 in 지시어를 사용한 반공변 인터페이스이고요! 함수 역시 T 타입을 받기만 하고 있습니다. (반환 타입에 T가 있는게 아니라 매개변수 쪽에만 T가 있죠)
답변이 도움이 되었으면 좋겠습니다. 감사합니다. 🙇