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 <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;
}
