3

이 문제에서 예를 들어 scala.concurrent.Future을 반환하는 스칼라 루틴의 결과를 사용하여 java.util.concurrent.Future을 예상하는 타사 Java 라이브러리를 호출해야합니다.스칼라와 자바 interop. of

def someScalaFunction(): scala.concurrent.Future[T] 

def otherJavaMethod(arg: java.util.concurrent.Future[T]) = ... 

나는 새로운 자바 미래에 스칼라 - 미래, 그러나 그렇지 않으면 저를 주시기 바랍니다 경우 (이 랩 스칼라 - 미래를 중단하는 방법으로 자바 미래 방법 def cancel(mayInterruptIfRunning: Boolean): Boolean을 구현하는 방법은 없습니다 감싸는 것 알고있다).

이 문제를 어떻게 해결할 수 있습니까?

  1. 어쨌든 래퍼를 작성하고 단지 cancel에 전화를 무시 (또는 NotImplementedError 던져) 어쩌면 다음 호출 래핑됩니다 클로저를 반환하는
  2. 변화 someScalaFunction을 :이 내가 가지고 올 접근 방법이다 Scala 또는 Java Future에서.

일부 클라이언트는 cancel의 적절한 구현에 의존 할 수 있지만 그다지 중요하지는 않습니다. 2. 정말 못 생기는 API가 생길 것입니다.

답변

3

cancel은 작업 취소 만 시도하지만 Javadoc에 따라 보장되지는 않습니다. 따라서 무언가를하기 위해 구현할 필요가 없습니다. 미래의 계산에 따라 전체 응용 프로그램에서 cancel 호출을 무시하는 것이 중요하지 않을 수도 있습니다.

정말로 취소해야하는 경우 절반 해결책은 this question을 참조하십시오.

그렇지 않으면 두 번째 해결 방법을 사용할 수 있습니다. 암시 적 변환을 통해 더 멋지게 만들 수 있습니다.

object JavaInterOp { 
    implicit def f2future[F[_]](f:() => T): java.util.concurrent.Future[T] = fc(f) 
} 

이렇게하면 가져 오기가 제공 할 변환을 제어합니다.

한 가지 문제는 실제로 원하지 않는 곳에서 변환을 수행 할 수 있다는 것입니다. 놀라운 효과가 발생할 수 있습니다.