[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.이것은 가치로 많은 관심으로하지 않는 객체 지향 프로그래밍의 기본 기능입니다.
이것은 가치로 많은 관심으로하지 않는 객체 지향 프로그래밍의 기본 기능입니다.
당신이 수집 C [+ T]를 가지고 가정하자. 무엇 + T 수단에 해당하는 경우, U :
이제, 당신은 어떻게이 주위를받을 수 있나요?
하나의 옵션은 클래스 불변을합니다 (+ 드롭)하는 것입니다. 또 다른 옵션은 메소드 매개 변수를 사용하는 경우뿐만 아니라, 슈퍼 클래스를 허용하는 것입니다 : m를 [S> : T (S : S). T의 슈퍼 클래스는 U의 슈퍼 클래스이며, 방법은 작동합니다 : T는 U로 변경 이제 경우, 그것은 별거 아니. (그러나 다음과 같은 일을 처리 할 수 있도록 방법을 변경해야합니다.)
이 경우 클래스, 그것은 당신이 그것을 불변 할 권리 않는 한 그것을 얻기 위해 훨씬 더 힘들어합니다. 나는 그 일을하고, 다른 곳에서 제네릭과 분산을 추진하는 것이 좋습니다. 하지만이 사용 사례 위해 일 것이라는 점을 확인하기 위해 자세한 내용을 볼 필요가 것입니다.
-
==============================
2.거의 다 왔어. 이리:
거의 다 왔어. 이리:
scala> trait MyTrait[+T] { | private case class MyClass[U >: T](c: U) | } defined trait MyTrait
어떤 수단의 MyClass의 [모든] 사람이 그 위치에서 T를 사용할 수없는 이유의 루트에 모든 T. 유효하지만 나는 순간의 기분에있어보다 더 많은 코드를 필요로 보여. :-)
from https://stackoverflow.com/questions/9619121/why-is-parameter-in-contravariant-position by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 어떻게 스파크 RDD / Dataframe 크기를 찾는 방법은? (0) | 2019.11.11 |
---|---|
[SCALA] 스칼라의 기호 리터럴에 대한 몇 가지 예를 들어, 사용 사례는 무엇입니까? (0) | 2019.11.11 |
[SCALA] 어떻게 튜플에 함수를 적용? (0) | 2019.11.11 |
[SCALA] 어떻게 반복 가능 객체의 스칼라의 목록에서 DataFrame를 만드는 방법? (0) | 2019.11.11 |
[SCALA] 스칼라에서 "보기"기능은 무엇입니까? (0) | 2019.11.11 |