2017-07-26 6 views
1

に "呼び出し可能 " Javaメソッドを変換します。 は、私は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 
     } 
    } 
} 

。しかし、私はこのための正しい実装が何であるべきか考えなければなりません。何か案は?

答えて

2

これはKotlinのコンバータのバグだと思います。それはCallable<T>の代わりに() -> Tにコードを変換しました(これは基本的に同じですが、実際は異なるタイプです)。 これは、作業コード

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

ですこれは、私はそれをやった方法ですあまりにも冗長であるかもしれないが、それは動作します。私はまた、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() 
} 
関連する問題