library;
import self as self;
import "dart:core" as core;
import "package:expect/expect.dart" as exp;

import "package:expect/expect.dart";

class A<N extends core::Object = dynamic, S extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
  final field core::List<self::A::U> field;
  constructor •(self::A::N n, self::A::S s) → self::A<self::A::N, self::A::S, self::A::U>
    : self::A::field = core::_GrowableList::•<self::A::U>(0), super core::Object::•() {
    exp::Expect::isTrue(n is self::A::N);
    exp::Expect::isTrue(s is self::A::S);
  }
  constructor empty() → self::A<self::A::N, self::A::S, self::A::U>
    : self::A::field = null, super core::Object::•() {}
  const constructor c(self::A::U u, self::A::S s) → self::A<self::A::N, self::A::S, self::A::U>
    : self::A::field = const <core::Null>[null], super core::Object::•()
    ;
  static factory f<N extends core::Object = dynamic, S extends core::Object = dynamic, U extends core::Object = dynamic>(self::A::f::S s) → self::A<self::A::f::N, self::A::f::S, self::A::f::U> {
    exp::Expect::isTrue(s is self::A::f::S);
    return new self::A::empty<self::A::f::N, self::A::f::S, self::A::f::U>();
  }
  get getter() → core::List<self::A::U> {
    return this.{self::A::field};
  }
  set setter(generic-covariant-impl self::A::S s) → void {}
}
abstract class J<Aa extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
  synthetic constructor •() → self::J<self::J::Aa, self::J::B>
    : super core::Object::•()
    ;
}
abstract class I<H extends core::Object = dynamic, C extends core::Object = dynamic, K extends core::Object = dynamic> extends self::J<self::I::C, self::I::K> {
  synthetic constructor •() → self::I<self::I::H, self::I::C, self::I::K>
    : super self::J::•()
    ;
}
static method main() → dynamic {
  new self::A::•<core::num, core::double, core::List<dynamic>>(1, 2.0);
  self::A<dynamic, dynamic, dynamic> a = self::A::f<core::int, core::int, core::int>(1);
  const self::A::c<core::int, core::int, core::List<dynamic>>(const <dynamic>[], 1);
  core::List<dynamic> z = a.{self::A::getter};
  a.{self::A::setter} = 1;
}
