Kotlin函数返回值的默认通用参数

时间:2020-03-12 11:30:12

标签: generics kotlin

我有一个函数可以根据传递的参数返回通用类型,但是我无法设置其默认值。这是我的示例功能:

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

但是,我得到默认参数的类型不匹配错误:预期Class<T>,发现Class<BaseClass>。 我可以使用第二个功能实现相同的目的:

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

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

看上去不像科特林那样。是否可以使用默认的通用参数?谢谢。

1 个答案:

答案 0 :(得分:3)

您的第一行代码在实践中将不可用。如果执行此操作会怎样?

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>