Я разработал класс Task для синхронного вычисления некоторого значения T. Теперь я хочу предоставить способ асинхронного получения значения.
Впервые я использую Promise в Scala. Я написал следующий код:
abstract class Task[+T](
...
final def result: Try[T] = {
if (state != TaskState.Terminated)
throw new IllegalStateException("Task must be terminated")
cached_result
}
}
// OTHER CLASS
private val executedTasks = HashMap[TaskID, Task[_]]()
private val promises = HashMap[TaskID, Promise[Any]]()
...
def onTaskEvent(taskEvent: TaskEvent): Unit = {
...
val task: Task[_] = ...
promises.get( task.id ).foreach( p => p complete task.result ) // fulfill the promise with a Try[_]
...
}
...
/**
* if the task exists and is terminated I return the result immediately
* otherwise I make a promise
*/
def getTaskResult(uuid: TaskID): Future[_] = {
executedTasks.get(uuid) match {
case Some(task) if task.state == TaskState.Terminated => Future.fromTry(task.result)
case _ => {
val p = Promise[Any]()
promises.put(uuid, p)
p.future
}
}
}
Этот код работает, но я хочу избавиться от этого уродливого Any
в Promise и продолжать использовать универсальные типы. Когда я пытался использовать Promise[_]
, я получал загадочную ошибку компилятора типа "expected: Try[_] actual: Try[_$1]"
или "Promise[_]: unbound wildcard type"
.
Спасибо за вашу помощь.