简体   繁体   中英

Kotlin default generic parameter of function return value

I have a function that returns generic type based on passed parameter, but I can't set its default value. Here's example function I have:

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

However, I get type mismatch error for default parameter: expected Class<T> , found Class<BaseClass> . I can achieve same thing using second function:

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

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

Which doesn't look Kotlin-way. Is it possible to have default generic parameter? Thanks.

Your first line of code wouldn't be usable in practice. What happens if you do this?

class Derived: BaseClass()

val x = parse<Derived>(someJson)

It would be violating its own definition of the generic type.

Your solution above may be the best you can do for your use case. You might also consider using a reified type like this:

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

This doesn't provide you any default, but it allows the compiler to infer the type where possible, so in some cases you wouldn't have to specify the class:

fun someFunction(derived: Derived) {
    //...
}

someFunction(parse(someJson)) // no need to specify <Derived>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM