inline fun String.convert(): T {
return when {
“” is T → this
1 is T → toInt()
1L is T-> toLong()
’ ’ is T → first()
true is T → toBoolean()
else → fail(“Unknown type”)
} as T
}
If I understand it correctly you want a “magic” conversion function. This is possible, but works different from how you are putting it:
inline fun <reified T> String.convert(): T = when(T::class) {
Any::class,
CharSequence::class,
String::class
-> this
Int::class
-> toInt()
Long::class
-> toLong()
Character::class
-> first()
Boolean::class
-> toBoolean()
else -> fail("Unknown type")
} as T
As it all happens at compile time, I do wonder why not use the conversion functions directly. Alternatively you can create an function that takes a class parameter to handle runtime cases. You can even have an inline forwarder that passes a reified type parameter for this.
3 Likes
I have done it for compact reading from console
fun main() {
val (integer, long, string) = readFromConsole<Int, Long, String>()
}
inline fun <reified T1, reified T2, reified T3> readFromConsole(): Triple<T1, T2, T3> {
val (first, second, third) = readStrings()
return Triple(first.convert(), second.convert(), third.convert())
}
@Suppress("IMPLICIT_CAST_TO_ANY")
inline fun <reified T> String.convert(): T {
return when (T::class) {
String::class -> this
Int::class -> toInt()
Long::class -> toLong()
Char::class -> first()
Boolean::class -> toBoolean()
else -> throw IllegalStateException("Unknown type")
} as T
}
1 Like