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() } 
  • Convención de nomenclatura de Kotlin para methods de retorno booleans
  • cómo inicializar correctamente el recurso compartido en kotlintest 2.x (interceptSpec)
  • ¿Cómo poner los files de res del proyecto en el contenedor en la misma carpeta?
  • Daga inyectar en superclass y subclass
  • JSON a HashMap con objects usando Gson
  • Kotlin: ¿Pasa y consume una function de 2 parameters?
  • parámetro de function final o val o en Kotlin?
  • Cómo fusionar 2 flujos separados, almacenar los datos rellenos y subscribirlos después de un time corto
  • ¿Cuál es la política de compatibilidad de Kotlin?
  • ¿Cómo escribir una transformación reutilizable para el valor de String to Enum en un grupo de classs Enum? (Kotlin)
  • Pase la function que recibe params como parámetro al método de extensión de class