library;
import self as self;
import "dart:core" as core;

class MapLike<K extends core::Object? = dynamic, V extends core::Object? = dynamic> extends core::Object {
  final field core::Map<self::MapLike::K%, self::MapLike::V%> _map;
  synthetic constructor •() → self::MapLike<self::MapLike::K%, self::MapLike::V%>
    ;
  method get(core::Object key) → self::MapLike::V?
    ;
  method put(covariant-by-class self::MapLike::K% key, covariant-by-class self::MapLike::V% value) → self::MapLike::V%
    ;
}
class MapLike2<K extends core::Object? = dynamic, V extends core::Object? = dynamic> extends core::Object {
  final field core::Map<self::MapLike2::K%, self::MapLike2::V%> _map;
  final field self::MapLike2::V% defaultValue;
  constructor •(self::MapLike2::V% defaultValue) → self::MapLike2<self::MapLike2::K%, self::MapLike2::V%>
    ;
  method get(core::Object key) → self::MapLike2::V%
    ;
  method put(covariant-by-class self::MapLike2::K% key, covariant-by-class self::MapLike2::V% value) → self::MapLike2::V%
    ;
}
extension Extension<K extends core::Object? = dynamic, V extends core::Object? = dynamic> on self::MapLike<K%, V%> {
  operator [] = self::Extension|[];
  operator []= = self::Extension|[]=;
}
extension Extension2<K extends core::Object? = dynamic, V extends core::Object? = dynamic> on self::MapLike2<K%, V%> {
  operator [] = self::Extension2|[];
  operator []= = self::Extension2|[]=;
}
static extension-member method Extension|[]<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike<self::Extension|[]::K%, self::Extension|[]::V%> #this, core::Object key) → self::Extension|[]::V?
  ;
static extension-member method Extension|[]=<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike<self::Extension|[]=::K%, self::Extension|[]=::V%> #this, self::Extension|[]=::K% key, self::Extension|[]=::V% value) → void
  ;
static extension-member method Extension2|[]<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike2<self::Extension2|[]::K%, self::Extension2|[]::V%> #this, core::Object key) → self::Extension2|[]::V%
  ;
static extension-member method Extension2|[]=<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike2<self::Extension2|[]=::K%, self::Extension2|[]=::V%> #this, self::Extension2|[]=::K% key, self::Extension2|[]=::V% value) → void
  ;
static method main() → dynamic
  ;
static method implicit() → dynamic
  ;
static method explicitWithTypeArguments() → dynamic
  ;
static method explicitInferredTypeArguments() → dynamic
  ;
static method expect(dynamic expected, dynamic actual) → dynamic
  ;
