스칼라에서 약속은 공변인으로 정의되지만 약속은 불변합니다. 약속은 거의 반 행위로 만들 수 있다고합니다 (https://issues.scala-lang.org/browse/SI-7467). 왜 이런 경우입니까? 약속이 공변 된 경우Promise가 공변인이 될 수없는 이유
답변
당신은 할 수있을 것입니다 :
val p: Promise[Any] = Promise[String]()
p.success(1)
하여 안전하지 않을 것 인
Int
와
Promise[String]
를 완료.
Promise
은 가변적 인 API로, 공분산과 잘 조화되지 않습니다. Future
Promise
처럼 수동으로 완료 할 수 없으므로이 문제가 발생하지 않습니다.
의 우리가 있다고 가정 해 봅시다 :
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]
.
여기서는 변형에 대한 문제가 아닙니다. 나는 '약속'이 반공 변할 수 있다고 생각한다. – ZhekaKozlov
@ ZhekaKozlov 그것은 공분산에 대한 문제입니다. 이것은 질문에서 묻는 것입니다. –
공분산에는 문제가 있지만 ** 분산에는 적합하지 않습니다 ** – ZhekaKozlov
- 1. $ resource promise가 해결 될 때 $ scope를 업데이트하십시오.
- 2. 다중 부분 식별자가 바인딩 될 수없는 이유
- 3. 배열 내부에 Promise가 없습니다.
- 4. SignalR을 사용할 수없는 이유
- 5. Promise가 거부 될 때 Promise 체인 순서가 중요한 것은 무엇입니까?
- 6. 알림이 표시 될 때 시작 페이지를 실행할 수없는 이유
- 7. R이 어떤 이유로 생성 될 수없는 경우, 이유/원인이 표시됩니까?
- 8. AngularJS $ promise가 정의되지 않았습니다.
- 9. ** kwargs를 사용할 수없는 이유
- 10. 수없는 이유 때 removeEventListener
- 11. 알 수없는 충돌 이유
- 12. sklearn을 가져올 수없는 이유
- 13. WebResources를 찾을 수없는 이유
- 14. 'strdup'누출 - 알 수없는 이유
- 15. Promise가 완료되기 전에 메서드가 호출됩니다.
- 16. 'DefaultInlineConstraintResolver'가 'apiVersion'을 해결할 수없는 이유
- 17. 왜 이유 배열이 변경 될 수 있습니까?
- 18. ReferenceError : Promise가 정의되지 않았습니다. OnsenUI
- 19. promise가 transformFunction 내에서 해결되었는지 확인하십시오
- 20. JS : Promise가 값을 반환하지 않습니다.
- 21. gcc에서 지연을 사용할 수없는 이유
- 22. json으로 액세스 할 수없는 이유
- 23. 승객 알 수없는 이유 - 문구
- 24. 전체 화면을 재생할 수없는 이유
- 25. 셀란에서 PhantomJs를 사용할 수없는 이유
- 26. .NET4.0에서 AccessViolationException을 잡을 수없는 이유
- 27. div를 토글 할 수없는 이유
- 28. iOS에서 DTrace를 사용할 수없는 이유
- 29. 결과 개체를 수정할 수없는 이유
- 30. 시간에 crontab을 실행할 수없는 이유
간단한 규칙이 있습니다. 값을 얻을 수 있으면 공변 (Try, Future, List, Vector, Option ...)입니다. 가치를 부여 할 수 있다면 반동적입니다 (약속, 주문, 소비자 등 ...). – ZhekaKozlov