【问题标题】:Generic type function with different return type [duplicate]具有不同返回类型的泛型类型函数
【发布时间】:2020-02-20 21:23:05
【问题描述】:

我现在遇到了一个知识问题,如果您能提供任何帮助,我将不胜感激。这是我的问题,我有多种功能:

    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()
    }
}

但是 IDE 不允许我这样做,因为返回类型不是泛型类型存在问题,我知道可以执行此类操作,但不知道如何操作。 你能帮我完成fun &lt;T&gt;吗?

【问题讨论】:

  • 制作返回类型Any?
  • 这能回答你的问题吗? A function with generic return type
  • 出于任何原因,我都不建议这样做。重载是最清晰的解决方法,最好有编译时异常而不是运行时异常。
  • 我可以做到Any?,但它并不是那么干净
  • @Daniel 这确实是一个很好的理由,我正在考虑代码的清晰性并可能以更漂亮的方式进行重构,并没有考虑可能的崩溃

标签: kotlin


【解决方案1】:

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

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()
    }
}

【讨论】:

  • prefs.get*(..) 返回一个可为空的,所以它应该是 as T? 我认为
  • 我会按照@Daniel 在我帖子的评论中建议的那样做,并使用重载而不是这个函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 2018-12-24
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
相关资源
最近更新 更多