請原諒我對Scala的不理解。我只是一個想要在Play框架中工作的Java開發人員。我甚至試圖使用Java代碼來實現一個特性,但是我得到了更加晦澀的錯誤。我有以下Scala代碼:故障擴展Scala的未來[T]特性
package models
import scala.concurrent.Future
class SettableFuture[T](name: String) extends Future[T] {
var assignedValue: T
def set(newValue: T) =
assignedValue = newValue
//override abstract methods in Future[T]
def ready(atMost: scala.concurrent.duration.Duration)(implicit permit: scala.concurrent.CanAwait): models.SettableFuture[T] =
this
def result(atMost: scala.concurrent.duration.Duration)(implicit permit: scala.concurrent.CanAwait): T =
assignedValue
def isCompleted: Boolean =
false
def onComplete[U](func: scala.util.Try[T] => U)(implicit executor: scala.concurrent.ExecutionContext): Unit =
null
def value: Option[scala.util.Try[T]] =
null
}
這是我的錯誤:
overriding method ready in trait Awaitable of type (atMost: scala.concurrent.duration.Duration)(implicit permit: scala.concurrent.CanAwait)SettableFuture.this.type; method ready has incompatible type
忽略的,現在的方法的返回值,他們是荒謬的,因爲我只是試圖解決所有編譯錯誤。
我簡單地從擴展特性時編譯時異常中複製了方法存根,而不覆蓋其抽象方法並將它們粘貼到我的源文件中。我不明白爲什麼我仍然有錯誤。我在Awaitable看了ready()的簽名,看起來返回類型實際上應該是類。
編輯:爲什麼我要實現這個原因是因爲在Promise/Future Scala API中,我只能找到讓我異步執行長時間運行的阻塞任務的東西。我所追求的是一些可以暫停請求的執行,直到感興趣的東西在SettableFuture實例中設置一個值,從而完成發送響應的Promise。這樣就有點像延續了。總之,這裏是我結束了工作代碼:
package models
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.AtomicInteger
import scala.concurrent.CanAwait
import scala.concurrent.ExecutionContext
import scala.concurrent.Future
import scala.concurrent.duration.Duration
import scala.util.Try
class SettableFuture[T]() extends Future[T] {
private final val ValueNotSet = 0
private final val ValueBeingSet = 1
private final val ValueSet = 2
private val valueStatus: AtomicInteger = new AtomicInteger(ValueNotSet)
private val onCompleteWaitHandle: CountDownLatch = new CountDownLatch(1)
private var onComplete: Try[T] => _ = _
private var assignedValue: T = _
/** Set a value and complete this Future.
*
* Returns false if the value has already been set by a past call to this method.
* Otherwise, marks this Future as complete, executes the function passed to
* onComplete, and finally returns true.
*/
def set(newValue: T): Boolean = {
//set value and trigger onComplete only once
if (valueStatus.compareAndSet(ValueNotSet, ValueBeingSet)) {
assignedValue = newValue
valueStatus.set(ValueSet)
onCompleteWaitHandle.countDown()
if (onComplete != null)
onComplete(Try(assignedValue))
true
}
false
}
//override abstract methods in the Future[T] trait
def ready(atMost: Duration)(implicit permit: CanAwait): this.type = {
onCompleteWaitHandle.await(atMost.length, atMost.unit)
this
}
def result(atMost: Duration)(implicit permit: CanAwait): T = {
ready(atMost)
assignedValue
}
def isCompleted: Boolean = (valueStatus.get() == ValueSet)
def onComplete[U](func: Try[T] => U)(implicit executor: ExecutionContext): Unit =
onComplete = func
def value: Option[Try[T]] = {
if (!isCompleted)
None
Some(Try(assignedValue))
}
}
感謝您的幫助。我現在已經完全使用了Scala代碼。至於Promise和Future,我不確定這是否正是我想要實現的。我覺得大部分API都處理長時間運行,阻塞任務。我所追求的是一些可以暫停請求的執行,直到感興趣的東西在SettableFuture實例中設置一個值,從而完成發送響應的Promise。這樣就有點像延續了。您是否知道Scala庫中存在的任何類似的東西? –
@KevinJin這就是'Promise'的意思。將設置該值的代碼保留對Promise'p'的引用,它將在未來的某個時刻用值完成。等待該值的計算獲得對'p.future'的引用,並且可以以通常的方式(註冊回調,映射等)對將來的完成作出反應。 –