All objects that implement the ObjectWrapper interface are handled in a special way by the compiler.
Such objects are thin wrappers over the actual object.
Dim m As Map
m.Initialize
Dim list1 As List
list1.Add(m) '<---- Add method expects an Object.
Dim m2 As Map = list1.Get(0) 'Get method returns an Object
If the wrapped object type doesn't exactly match the other type (Object in the above example) then the compiler gets (or sets) the inner object.
This means that the list should hold the inner object and not the wrapper.
Compile the above code in release mode and check the Java code. It will be more clear.