336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

다시 한번 복습 


A <: B 이고 C[A] <: C[B] 인걸 Covariant

A <: B 이고 C[A] >: C[B] 인걸 Contravariant


Contravariant 는 주로 함수를 파라미터로 넘길 때 일어난다고 이야기 함.


이걸 그림으로 다시 생각 해보자, 일단 아래와 같은 클래스가 있다. 


class Animal {}

class Bird extends Animal {}
class Chicken extends Bird {}
class Duck extends Bird {}


이걸 밴 다이어 그램으로 그려보면 아래와 같이 된다.



이제 함수를 선언해보자. 

object HelloWorld {
  type FunctorType[A] = (A => String) //함수타입 한개 선언

  val animalFunc : FunctorType[Animal] = { a => "Animal" }
  val birdFunc : FunctorType[Bird] = { a => "Bird" }
  val chickenFunc : FunctorType[Chicken] = { a => "Chicken"}
  val duckFunc : FunctorType[Duck] = { a => "Duck"}
}


위의 밴 다이어 그램을 보면서 다시 정리해보자 


Animal >: Bird 이면, FunctorType[Animal] 과 FunctorType[Bird] 의 관계는?


FunctorType[Animal] 을 풀어보면 Animal => String 이고, 

FunctorType[Bird] 을 풀어보면 Bird => String 인데, 

위의 벤 다이어그램에서 보면, Bird 는 Animal 의 부분집합 이니까, 모든 Bird 는 Animal 이다. 따라서, 


FunctorType[Bird]  는 Bird => String 도 될 수 있고, Animal => String 도 될 수 있다. 


때문에, FunctorType[Animal] <: FunctorType[Bird] 이 되고, 


FunctorType 은 contravariant 가 된다... 

블로그 이미지

캡틴토마스

그저 걷고 있는거지...

,