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