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::List::•<self::A::U>(), 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 <dynamic>[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<dynamic, dynamic, dynamic>();
  }
  get getter() → core::List<self::A::U> {
    return this.{self::A::field};
  }
  set setter(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);
  dynamic z = a.getter;
  a.setter = 1;
}
