简体   繁体   中英

Kotlin: generic cast function parameter

Taking my first steps in Kotlin, I'm struggling to find the correct signature for a function that receives an instance of a known class along with the desired output class and then looks in a map of converter lambdas whether the conversion can be done.

Here's an example for Long :

    private fun <T> castLong(value: Long, clazz: Class<out T>): T {
        // map lookup removed for simplicity
        return when (clazz) {
            String::class.java -> { value.toString() }
            else -> { throw IllegalArgumentException("Unsupported Cast") }
        }
    }

Where T is the class of the desired return value - let's say String . One should be able to call castLong(aLongValue, String::class.java) and receive an instance of String . But the compiler says:

Type mismatch: inferred type is String but T was expected

This seems like it should be possible as it is quite straightforward so far but even playing around with reified and other constructs didn't yield any better results.

It happens because it can't smart cast String to T , you have to manually cast it.

Furthermore, since you said you are taking your first steps in Kotlin, I leave here two other "advices" not strictly related to your question:

  1. you can get the class of T making it reified
  2. the brackets of a case using when aren't necessary if the case is one line
private inline fun <reified T> castLong(value: Long): T {
    // map lookup removed for simplicity
    return when (T::class.java) {
        String::class.java -> value.toString()
        else -> throw IllegalArgumentException("Unsupported Cast")
    } as T
}

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