2015-02-02 21 views
12

ho un'interfaccia Java generato contenente un metodo:Converti futuro scala per il futuro del Java

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

Voglio realizzare utilizzando Akka. Ho scritto la seguente:

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

Il problema è che i rendimenti askscala.concurrent.Future[Any] e il metodo deve restituire java.util.concurrent.Future[?].

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

Come posso fare questa conversione?

risposta

4

Bene il suo non è pratico di convertirli, perché Scala Future non forniscono funzionalità per interrompere o qualsiasi altro meccanismo per la cancellazione. Quindi non esiste un modo diretto a prova di prova per cancellare un futuro tramite interruzione o altrimenti tramite la chiamata al metodo in Future.

Quindi la soluzione più semplice può essere se la cancellazione non è desiderato sarebbe:

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 
    } 
    } 

Ma nel caso se hai ancora bisogno cancel, una correzione handicap sarebbe come mostrato

here. Ma non lo consiglierei però come il suo traballante

Problemi correlati