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

abstract class Test<T extends core::Object* = dynamic, U extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → self::Test<self::Test::T*, self::Test::U*>*
    ;
  abstract operator [](core::String* s) → self::Test::T*;
  abstract operator []=(core::String* s, generic-covariant-impl self::Test::U* v) → void;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
static method getInt() → core::int*
  ;
static method getNum() → core::num*
  ;
static method getDouble() → core::double*
  ;
static method test1(self::Test<core::int*, core::int*>* t) → void
  ;
static method test2(self::Test<core::int*, core::num*>* t) → void
  ;
static method test3(self::Test<core::int*, core::double*>* t) → void
  ;
static method test4(self::Test<core::num*, core::int*>* t) → void
  ;
static method test5(self::Test<core::num*, core::num*>* t) → void
  ;
static method test6(self::Test<core::num*, core::double*>* t) → void
  ;
static method test7(self::Test<core::double*, core::int*>* t) → void
  ;
static method test8(self::Test<core::double*, core::num*>* t) → void
  ;
static method test9(self::Test<core::double*, core::double*>* t) → void
  ;
static method main() → dynamic
  ;
