Convirtiendo el método Java "Callable <T>" a Kotlin

Estoy tratando de convertir un método Java:

private <T> Callable<T> createCallable(final Callable<T> task) { return () -> { try { return task.call(); } catch (Exception e) { handle(e); throw e; } }; } 

del siguiente file Java ExceptionHandlingAsyncTaskExecutor.java en Kotlin.

El código se convierte automáticamente usando IntelliJ IDEA en:

 private fun <T> createCallable(task: Callable<T>): Callable<T> { return { try { return task.call() } catch (e: Exception) { handle(e) throw e } } } 

que no es correcto Pero tengo que imaginar cuál debería ser la implementación correcta para esto. ¿Algunas ideas?

Creo que este es un error de convertidor de Kotlin. Convirtió su código en () -> T lugar de Callable<T> (que es básicamente el mismo pero en realidad son types diferentes). Este es el código de trabajo

 private fun <T> createCallable(task: Callable<T>): Callable<T> { return Callable { try { task.call() } catch (e: Exception) { handle(e) throw e } } } 

Así es como lo hice, podría ser demasiado detallado, pero funciona. También implemento una function de handle .

 import java.util.concurrent.* private fun <T> createCallable(task: Callable<T>): Callable<T> { return object : Callable<T> { override fun call(): T { try { return task.call() } catch (e: Exception) { handle(e) throw e } } } } private fun handle(e: Exception): Unit { println("got exception") } 

Y así es como lo llamo en una testing …

 fun main(vararg argv: String): Unit { val callable1 = object : Callable<Int> { override fun call(): Int = 1 } val c1 = createCallable(callable1) println("callable1 = ${c1.call()}") val callable2 = object : Callable<Unit> { override fun call(): Unit { println("Hello"); throw Exception("Hello") } } val c2 = createCallable(callable2) c2.call() }