2015-02-02 13 views
12

Ich habe eine generierte Java-Schnittstelle eine Methode enthält:Convert scala Zukunft java Zukunft

public Future<?> getCustomersAsync(AsyncHandler<Customer> asyncHandler); 

Ich mag es implementieren Akka verwenden. Ich schrieb folgendes:

override def getCustomerAsync(asyncHandler: AsyncHandler[Customer]): Future[_] = { 
    myActorRef.ask(GetCustomer, system.actorOf(Props[Responder])) 
} 

Das Problem ist, dass ask kehrt scala.concurrent.Future[Any] und das Verfahren muss java.util.concurrent.Future[?] zurückzukehren.

Error:(33, 17) type mismatch; 
found : scala.concurrent.Future[Any] 
required: java.util.concurrent.Future[?] 
    myActorRef.ask(GetCustomer, system.actorOf(Props[Responder])) 
       ^

Wie kann ich diese Konvertierung durchführen?

Antwort

4

Nun, es ist nicht sinnvoll, sie zu bekehren, weil scala Future keine Funktionalität zu unterbrechen oder irgendein anderer Mechanismus für die Annullierung. So gibt es keine direkte Full-Proof Möglichkeit, eine Zukunft durch Unterbrechung oder auf andere Weise über Methodenaufruf in Zukunft abzubrechen.

So kann die einfachste Lösung, wenn die Stornierung wäre nicht erwünscht ist:

def convert[T](x:Future[T]):java.util.concurrent.Future[T]={ 
    new concurrent.Future[T] { 
     override def isCancelled: Boolean = throw new UnsupportedOperationException 

     override def get(): T = Await.result(x, Duration.Inf) 

     override def get(timeout: Long, unit: TimeUnit): T = Await.result(x, Duration.create(timeout, unit)) 

     override def cancel(mayInterruptIfRunning: Boolean): Boolean = throw new UnsupportedOperationException 

     override def isDone: Boolean = x.isCompleted 
    } 
    } 

Aber für den Fall, wenn Sie noch brauchen cancel, ein behindertes fix sein würde, wie

gezeigt

here. Aber ich würde es nicht empfehlen, denn es ist wackelig