Преобразование метода «Callable <T>» Java в Kotlin

Я пытаюсь преобразовать метод Java:

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

из следующего Java-файла ExceptionHandlingAsyncTaskExecutor.java в Kotlin.

Код автоматически преобразуется с использованием IntelliJ IDEA в:

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

что неверно. Но я должен понять, какая правильная реализация для этого должна быть. Есть идеи?

Я думаю, что это ошибка конвертера Kotlin. Он преобразовал ваш код в () -> T вместо Callable<T> (который в основном тот же, но на самом деле это разные типы). Это рабочий код

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

Вот как я это сделал, может быть слишком многословным, но он работает. Я также реализую функцию 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") } 

И это, как я называю это в тесте …

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