I changed your code a bit. Now a function getMapper inlinewith a reified generic type, which makes the call pretty readable in getMapper<Dog>().
reified : reified Kotlin?
private inline fun <reified T> getMapper(): Printer<T> {
when (T::class) {
Cat::class -> return CatPrinter() as Printer<T>
Dog::class -> return DogPrinter() as Printer<T>
}
throw IllegalArgumentException()
}
fun main(args: Array<String>) {
println(getMapper<Dog>().mapToString(Dog()))
println(getMapper<Cat>().mapToString(Cat()))
}
, . getMapper. , .
, , , .