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) → core::Null {});
  fooInt.{self::Foo::method}(3);
  fooInt.{self::Foo::setter} = 3;
  fooInt.{self::Foo::withCallback}((core::int x) → core::Null {});
  fooInt.{self::Foo::withCallback}((core::num x) → core::Null {});
  fooInt.{self::Foo::mutableField} = 3;
  fooInt.{self::Foo::mutableCallbackField} = (core::int x) → core::Null {};
  self::Foo<core::num> fooNum = fooInt;
  fooNum.{self::Foo::method}(3);
  fooNum.{self::Foo::method}(2.5);
  fooNum.{self::Foo::setter} = 3;
  fooNum.{self::Foo::setter} = 2.5;
  fooNum.{self::Foo::withCallback}((core::num x) → core::Null {});
  fooNum.{self::Foo::mutableField} = 3;
  fooNum.{self::Foo::mutableField} = 2.5;
  (fooNum.{self::Foo::mutableCallbackField} as{TypeError} (core::num) → void).call(3);
  (fooNum.{self::Foo::mutableCallbackField} as{TypeError} (core::num) → void).call(2.5);
  fooNum.{self::Foo::mutableCallbackField} = (core::num x) → core::Null {};
}
