2017-09-25 5 views
0

스칼라 변화에 대한 질문이 있습니다.val 사용의 오차가 있습니다. - 오류 : 반 변형 타입 U가 공변 위치에 있습니다.

아래 코드는 컴파일을 통과하는 유효한 코드입니다.

// <Code A> 
// VALID (COMPILE PASS!) 
class A[+T, -U](t: T, u: U) 

는 그러나 아래의 코드는 val를 사용하여 컴파일 통과하지 않는, 유효하지 않습니다.

// <Code B> 
// INVALID (COMPILE ERROR) 
class A[+T, -U](val t: T, val u: U) 

오류 메시지는 다음과 같습니다. <Code A>이 유효하고 <Code B>이 유효하지 않은 이유를

error: contravariant type U occurs in covariant position in type => U of value u 
class A[+T, -U](val t: T, val u: U) 
           ^

이 궁금하다. 누군가 이유를 말해 줄 수 있니?

답변

2

U은 반공 변이라고 선언했습니다 (즉, -U의 의미 임). 반공 변성에 대한 또 다른 생각은 그것이 "입력 유형"이라는 것입니다. 즉. 형식은 메서드의 매개 변수로 사용할 수 있지만 반환 값으로는 사용할 수 없습니다.

val로 선언하면 이제 클래스 외부에서 "출력 값"으로 액세스 할 수 있습니다. 이것은 반공의 규칙을 어기는 것이다.

U을 val로 만들려면 가능하면 공변수()로 만들어야하며 그렇지 않은 경우 입력이 필요하면 불변으로 만들어야합니다.

+0

답변 해 주셔서 감사합니다. – redstone

관련 문제