getLong
メソッド、getBoolean
およびを持つ Java オブジェクトがありますgetString
。最後のパラメータとして関数を持つ汎用拡張関数を作成しようとしました。getString
基本的に、例外をスローする可能性のある try と catch と etc への呼び出しをラップします。<reified T>
たとえば、呼び出し時に設定されているようgetIt<Long>() { // do something with it }
に、リフレクション API が必要であることを発見しましたT
。isチェックもisInstanceもできませんでした。何か案は?
// This is the non generic function version to get an idea
inline fun JSONObject.getItLong(key: String, block: (value: Long) -> Unit) {
try {
block(this.getLong(key))
} catch (e: JSONException) {
Log.w("${ javaClass.simpleName }KEx", e.message)
}
}
以下when
は動作しません。
inline fun <reified T> JSONObject.getIt(key: String, block: (value: T) -> Unit) {
try {
when {
Long is T -> { block(this.getLong(key) as T) }
String is T -> { block(this.getString(key) as T) }
// Boolean is T -> { block(this.getBoolean(key) as T) } // Boolean broken, does not have companion object?
}
} catch (e: JSONException) {
Log.w("fetchFromJSONObject", e.message)
}
}
したがって、ブール値の問題は別として、 を使用して適切なタイプの get を呼び出す一般的な方法が必要でしたT
。クラスパスに kaitlin リフレクション jar を追加する必要がありました。できれば避けたかった。
when
UPDATE1: withを使用した最初の回答と応答T::class
は、実際には機能しません。アイデアをありがとう、それは私がもう一度見るのを助けました. 2番目は、私が望んでいたものよりも「言葉が多い」と感じたので、この解決策に行き着きました。
inline fun <reified T> JSONObject.getIt(key: String, block: (value: T) -> Unit) {
try {
block(this.get(key) as T)
} catch (e: JSONException) {
Log.w("${ javaClass.simpleName }KEx", e.message)
}
}
jsonObj.getIt<String>("error") { er = it }
比べてみるとこんな感じjsonObj.getIt<String>("error", JSONObject::getString) { err = it }
UPDATE2:これは、少なくとも私にとっては、最終的にはより良いアプローチのように思われ、ジェネリックを使用して目標を達成する際の問題を回避します
inline fun JSONObject.unless(func: JSONObject.() -> Unit) {
try {
this.func()
} catch (e: JSONException) {
Log.w("${ javaClass.simpleName }KEx", e.message)
}
}
使用:
jsonObj.unless {
sDelay = getLong("s_delay") * 1000
wDelay = getLong("w_delay") * 1000
}
jsonObj.unless { sam = getBoolean("sam") }
jsonObj.unless { err = getString("error") }