Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 具有不同返回类型的泛型类型函数_Kotlin - Fatal编程技术网

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

Kotlin 具有不同返回类型的泛型类型函数,kotlin,Kotlin,我现在遇到了一个知识问题,我非常感谢你能提供的任何帮助。这是我的问题,我有多种功能: fun read(key: Key, defaultValue: String): String? { return prefs.getString(key.name, defaultValue) } fun read(key: Key, defaultValue: Boolean): Boolean? { return prefs.getBoolean

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

    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
函数,而是希望使用如下内容:

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()
    }
}
fun read(key:key,defaultValue:T):T?{
返回时间(默认值){
is String->prefs.getString(key.name,defaultValue)
is Boolean->prefs.getBoolean(key.name,defaultValue)
else->抛出IllegalArgumentException()
}
}
但是IDE不允许我这样做,因为返回类型不是泛型类型存在问题,我知道可以这样做,但不知道如何做。
你能帮我找到
的乐趣吗?

就我而言,重载是更好、更干净的方法,但是如果你死心塌地这样做,那么你可以使用未经检查的强制转换

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()
    }
}
fun read(key:key,defaultValue:T):T?{
返回时间(默认值){
是字符串->prefs.getString(key.name,defaultValue)作为T
是Boolean->prefs.getBoolean(key.name,defaultValue)作为T
else->抛出IllegalArgumentException()
}
}

将返回类型设置为任何?
这是否回答了您的问题?我不建议出于任何原因这样做。重载是最清晰的解决方法,最好使用编译时异常,而不是运行时异常。我可以将其设置为
Any?
,但事实并非如此cleaner@Daniel这确实是一个很好的理由,我在考虑代码的清晰性,并可能以更漂亮的方式进行重构,并且没有考虑到可能的崩溃
prefs.get*(..)
返回一个可为null的值,所以它应该是
作为t?
我想我会按照@Daniel在我的帖子中的建议,使用重载而不是这个函数