class TypeMap { val instances = mutableMapOf, Any>() operator fun set(type: KClass, instance: T) { instances[type] = instance } inline operator fun get(type: KClass): T { return instances[type] as T } } fun main() { val tm = TypeMap() tm[String::class] = "a" // does not compile if key/value types mismatch val value:String = tm[String::class] // same as above println(value) // a println(value is String) // true }