0

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 を追加する必要がありました。できれば避けたかった。

whenUPDATE1: 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") }
4

1 に答える 1