I'm new to Kotlin. When I learn Storing Properties in a Map. I try following usage.
class User(val map: MutableMap<String, String>) {
    val name: String by map
}
class User(val map: MutableMap<String, in String>) {
    val name: String by map
}
class User(val map: MutableMap<String, out String>) {
    val name: String by map
}
The first two are both work, the last one failed.
With out modifier, the bytecode of getName like this:
  public final java.lang.String getName();
     0  aload_0 [this]
     1  getfield kotl.User.name$delegate : java.util.Map [11]
     4  astore_1
     5  aload_0 [this]
     6  astore_2
     7  getstatic kotl.User.$$delegatedProperties : kotlin.reflect.KProperty[] [15]
    10  iconst_0
    11  aaload
    12  astore_3
    13  aload_1
    14  aload_3
    15  invokeinterface kotlin.reflect.KProperty.getName() : java.lang.String [19] [nargs: 1]
    20  invokestatic kotlin.collections.MapsKt.getOrImplicitDefaultNullable(java.util.Map, java.lang.Object) : java.lang.Object [25]
    23  checkcast java.lang.Object [4]
    26  aconst_null
    27  athrow
      Local variable table:
        [pc: 0, pc: 28] local: this index: 0 type: kotl.User
As we can see, it will cause a NullPointerException.
Why contravariant is not allowed on a map delegate?
And why kotlin doesn't give me a compile error?
 
     
    