具有不同返回类型的泛型函数

时间:2020-02-20 12:53:36

标签: kotlin

我现在遇到了一个知识问题,非常感谢您能提供的任何帮助。这是我的问题,我有多种功能:

do {
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    var betterMatchResults = try JSONDecoder().decode(BetterMatchResults.self, from: data)

    betterMatchResults.result = betterMatchResults.result.map {(betterMatch) in
        var match = betterMatch
        match.odds =  match.odds.sorted(by: { $0.name < $1.name })
        return match
    }

    //Test the response...
    print(betterMatchResults.result.map({ $0.odds.map({ $0.name }) })) //[["3Way Result", "Correct Score", "Over/Under"]]

} catch {
    print(error)
}

我不想使用其他类型重载 fun read(key: Key, defaultValue: String): String? { return prefs.getString(key.name, defaultValue) } fun read(key: Key, defaultValue: Boolean): Boolean? { return prefs.getBoolean(key.name, defaultValue) } fun read(key: Key, defaultValue: Int): Int { return prefs.getInt(key.name, defaultValue) } 函数,我想使用这样的东西:

read

但是,IDE不允许我,因为返回类型存在非通用类型的问题,我知道可以做这样的事情,但不知道如何做。 您能帮我整理一下fun<T> read(key: Key, defaultValue: T): T? { return when(defaultValue){ is String -> prefs.getString(key.name, defaultValue) is Boolean -> prefs.getBoolean(key.name, defaultValue) else -> throw IllegalArgumentException() } } 吗?

1 个答案:

答案 0 :(得分:0)

就我而言, 重载要好得多,而且是一种干净的方法 ,但是如果您不愿意这样做,则可以使用未经检查的强制转换< / p>

fun<T> read(key: Key, defaultValue: T): T? {
    return when(defaultValue){
        is String -> prefs.getString(key.name, defaultValue) as T
        is Boolean -> prefs.getBoolean(key.name, defaultValue) as T
        else -> throw IllegalArgumentException()
    }
}