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

typedef Callback<T extends core::Object = dynamic> = (T) → void;
class Foo<T extends core::Object = dynamic> extends core::Object {
  final field self::Foo::T finalField;
  final field (self::Foo::T) → void callbackField;
  generic-covariant-impl field self::Foo::T mutableField = null;
  field (self::Foo::T) → void mutableCallbackField = null;
  constructor •(self::Foo::T finalField, (self::Foo::T) → void callbackField) → self::Foo<self::Foo::T>
    : self::Foo::finalField = finalField, self::Foo::callbackField = callbackField, super core::Object::•()
    ;
  method method(generic-covariant-impl self::Foo::T x) → void {}
  set setter(generic-covariant-impl self::Foo::T x) → void {}
  method withCallback((self::Foo::T) → void callback) → void {
    callback.call(this.{self::Foo::finalField});
  }
}
static method main() → dynamic {
  self::Foo<core::int> fooInt = new self::Foo::•<core::int>(1, (core::int x) → dynamic {});
  fooInt.method(3);
  fooInt.setter = 3;
  fooInt.withCallback((core::int x) → dynamic {});
  fooInt.withCallback((core::num x) → dynamic {});
  fooInt.mutableField = 3;
  fooInt.mutableCallbackField = (core::int x) → dynamic {};
  self::Foo<core::num> fooNum = fooInt;
  fooNum.method(3);
  fooNum.method(2.5);
  fooNum.setter = 3;
  fooNum.setter = 2.5;
  fooNum.withCallback((core::num x) → dynamic {});
  fooNum.mutableField = 3;
  fooNum.mutableField = 2.5;
  fooNum.mutableCallbackField(3);
  fooNum.mutableCallbackField(2.5);
  fooNum.mutableCallbackField = (core::num x) → dynamic {};
}
