【问题标题】:Kotlin default generic parameter of function return valueKotlin 函数返回值的默认泛型参数
【发布时间】:2020-06-24 10:52:53
【问题描述】:

我有一个基于传递参数返回泛型类型的函数,但我无法设置其默认值。这是我的示例函数:

fun <T : BaseClass> parse(json: String, gson: Class<T> = BaseClass::class): T =
  Gson().fromJson(json, gson)

但是,我收到默认参数的类型不匹配错误:预期 Class&lt;T&gt;,找到 Class&lt;BaseClass&gt;。 我可以使用第二个功能实现同样的功能:

fun <T : BaseClass> parse(json: String, gson: Class<T>): T =
  Gson().fromJson(json, gson)

fun BaseClass parse(json: String) =
  parse(json, BaseClass::class)

这看起来不像 Kotlin 方式。是否可以有默认的泛型参数?谢谢。

【问题讨论】:

    标签: generics kotlin


    【解决方案1】:

    您的第一行代码在实践中将无法使用。如果你这样做会发生什么?

    class Derived: BaseClass()
    
    val x = parse<Derived>(someJson)
    

    这将违反它自己对泛型类型的定义。

    您的上述解决方案可能是您可以为您的用例做的最好的解决方案。您也可以考虑使用这样的具体类型:

    inline fun <reified T : BaseClass> parse(json: String): T =
        Gson().fromJson(json, T::class)
    

    这不会为您提供任何默认值,但它允许编译器在可能的情况下推断类型,因此在某些情况下您不必指定类:

    fun someFunction(derived: Derived) {
        //...
    }
    
    someFunction(parse(someJson)) // no need to specify <Derived>
    

    【讨论】:

    • 谢谢,我明白你关于违反定义的观点。可悲的是,我必须在 Kotlin 中重写旧的 Java 代码并保持它们兼容。否则我会选择你的解决方案。尽管如此,2 个函数还是比我们重载的 4 个函数要好..
    猜你喜欢
    • 1970-01-01
    • 2022-07-24
    • 1970-01-01
    • 2012-08-03
    • 2017-06-20
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    相关资源
    最近更新 更多