2017-03-13 6 views
6

스칼라에서 약속은 공변인으로 정의되지만 약속은 불변합니다. 약속은 거의 반 행위로 만들 수 있다고합니다 (https://issues.scala-lang.org/browse/SI-7467). 왜 이런 경우입니까? 약속이 공변 된 경우Promise가 공변인이 될 수없는 이유

+0

간단한 규칙이 있습니다. 값을 얻을 수 있으면 공변 (Try, Future, List, Vector, Option ...)입니다. 가치를 부여 할 수 있다면 반동적입니다 (약속, 주문, 소비자 등 ...). – ZhekaKozlov

답변

7

당신은 할 수있을 것입니다 :

val p: Promise[Any] = Promise[String]() 
p.success(1) 

하여 안전하지 않을 것 인 IntPromise[String]를 완료.

1

Promise은 가변적 인 API로, 공분산과 잘 조화되지 않습니다. FuturePromise처럼 수동으로 완료 할 수 없으므로이 문제가 발생하지 않습니다.

의 우리가 있다고 가정 해 봅시다 :

class Animal 
class Cat extends Animal 
class Dog extends Animal 

을 우리가 Promise[Cat] <: Promise[Animal]Promise[Dog] <: Promise[Animal]를 원하는 의미, Promise[A]A을 통해 공변 될합니다. 우리가 이것을 할 수 있다고 가정 해 봅시다. 그것은 또한 Promise[Animal]의 우리의 상상으로

val p: Promise[Cat] = ... 

:

좋아, 그래서 우리가 Promise[Cat]가 있다고 가정 해 보자

val q: Promise[Animal] = p 

Promise이있는 Try[T]을 받아 complete라는 방법을 가지고 있습니다 또한 공변. 즉 Try[Dog]Try[Animal]입니다. 이것이 어디에서 주도하고 있는지 확인하십시오.

우리는 호출 할 수있을 것 : 우리가 죄송합니다Try[Animal]Promise[Animal]을 완료하기 위해 노력하고 있지만,하고 있기 때문에,

val value: Try[Dog] = ... 

q.complete(value) 

법적 될 것이라고, 우리는 또한 단지 Promise[Cat]을 완료하려고 Promise[Dog].

+1

여기서는 변형에 대한 문제가 아닙니다. 나는 '약속'이 반공 변할 수 있다고 생각한다. – ZhekaKozlov

+0

@ ZhekaKozlov 그것은 공분산에 대한 문제입니다. 이것은 질문에서 묻는 것입니다. –

+0

공분산에는 문제가 있지만 ** 분산에는 적합하지 않습니다 ** – ZhekaKozlov

관련 문제