복붙노트

[SCALA] 왜 contravariant 위치 매개 변수는 무엇입니까?

SCALA

왜 contravariant 위치 매개 변수는 무엇입니까?

그래서 같은 경우 클래스를 구성하는 특성 내부 공변 형식 매개 변수를 사용하려고 해요 :

trait MyTrait[+T] {
  private case class MyClass(c: T)
}

컴파일러는 말합니다 :

error: covariant type T occurs in contravariant position in type T of value c

나는 그 다음을 시도했지만 역시 작동하지 않았다 :

trait MyTrait[+T] {
  private case class MyClass[U <: T](c: U)
}

오류이 시간은 다음과 같습니다

error: covariant type T occurs in contravariant position in type >: Nothing <: T of type U

누군가는 T 여기에 공변 위치에있는 이유를 설명하고이 문제에 대한 솔루션을 제안 할 수 있을까요? 고마워!

해결법

  1. ==============================

    1.이것은 가치로 많은 관심으로하지 않는 객체 지향 프로그래밍의 기본 기능입니다.

    이것은 가치로 많은 관심으로하지 않는 객체 지향 프로그래밍의 기본 기능입니다.

    당신이 수집 C [+ T]를 가지고 가정하자. 무엇 + T 수단에 해당하는 경우, U :

    이제, 당신은 어떻게이 주위를받을 수 있나요?

    하나의 옵션은 클래스 불변을합니다 (+ 드롭)하는 것입니다. 또 다른 옵션은 메소드 매개 변수를 사용하는 경우뿐만 아니라, 슈퍼 클래스를 허용하는 것입니다 : m를 [S> : T (S : S). T의 슈퍼 클래스는 U의 슈퍼 클래스이며, 방법은 작동합니다 : T는 U로 변경 이제 경우, 그것은 별거 아니. (그러나 다음과 같은 일을 처리 할 수 ​​있도록 방법을 변경해야합니다.)

    이 경우 클래스, 그것은 당신이 그것을 불변 할 권리 않는 한 그것을 얻기 위해 훨씬 더 힘들어합니다. 나는 그 일을하고, 다른 곳에서 제네릭과 분산을 추진하는 것이 좋습니다. 하지만이 사용 사례 위해 일 것이라는 점을 확인하기 위해 자세한 내용을 볼 필요가 것입니다.

  2. ==============================

    2.거의 다 왔어. 이리:

    거의 다 왔어. 이리:

    scala> trait MyTrait[+T] {
         |   private case class MyClass[U >: T](c: U)
         | }
    defined trait MyTrait
    

    어떤 수단의 MyClass의 [모든] 사람이 그 위치에서 T를 사용할 수없는 이유의 루트에 모든 T. 유효하지만 나는 순간의 기분에있어보다 더 많은 코드를 필요로 보여. :-)

  3. from https://stackoverflow.com/questions/9619121/why-is-parameter-in-contravariant-position by cc-by-sa and MIT license