2015-02-02 33 views
12

Tôi có một giao diện java tạo ra có chứa một phương pháp:Chuyển đổi scala trong tương lai để tương lai java

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

tôi muốn thực hiện nó bằng cách sử Akka. Tôi đã viết như sau:

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

Vấn đề là ask lợi nhuận scala.concurrent.Future[Any] và phương pháp phải trả lại 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])) 
       ^

Làm cách nào để chuyển đổi này?

Trả lời

4

Vâng nó không thực tế để chuyển đổi chúng, bởi vì scala Future không cung cấp chức năng để làm gián đoạn hoặc bất kỳ cơ chế nào khác để hủy. Vì vậy, không có cách nào trực tiếp đầy đủ bằng chứng cách hủy tương lai thông qua gián đoạn hoặc theo cách khác thông qua cuộc gọi phương thức trong Tương lai.

Vì vậy, giải pháp đơn giản nhất có thể nếu huỷ không mong muốn sẽ là:

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

Nhưng trong trường hợp nếu bạn vẫn cần cancel, một sửa chữa khuyết tật sẽ như

here. Nhưng tôi sẽ không khuyên bạn nên mặc dù nó là rung lắc

Các vấn đề liên quan