library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;

class A<T extends core::Object? = dynamic> extends core::Object {
  covariant-by-class field self::A::T? _#A#x = null;
  field core::bool _#A#x#isSet = false;
  synthetic constructor •() → self::A<self::A::T%>
    : super core::Object::•()
    ;
  get x() → self::A::T%
    return this.{self::A::_#A#x#isSet}{core::bool} ?{self::A::T%} let final self::A::T? #t1 = this.{self::A::_#A#x}{self::A::T?} in #t1{self::A::T%} : throw new _in::LateError::fieldNI("x");
  set x(covariant-by-class self::A::T% x#param) → void {
    this.{self::A::_#A#x#isSet} = true;
    this.{self::A::_#A#x} = x#param;
  }
}
class B<T extends core::Object? = dynamic> extends core::Object {
  covariant-by-class field self::B::T? _y = null;
  synthetic constructor •() → self::B<self::B::T%>
    : super core::Object::•()
    ;
  get y() → self::B::T?
    return this.{self::B::_y}{self::B::T?};
  set y(covariant-by-class self::B::T? val) → void {
    this.{self::B::_y} = val;
  }
}
static method main() → dynamic {
  self::A<core::num> a = new self::A::•<core::int>();
  self::expect(42, a.{self::A::x} = 42);
  self::throws(() → void => a.{self::A::x} = 0.5);
  self::B<core::num> b = new self::B::•<core::int>();
  self::expect(42, b.{self::B::y} = 42);
  self::throws(() → void => b.{self::B::y} = 0.5);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}
static method throws(() → void f) → dynamic {
  try {
    f(){() → void};
  }
  on core::Object catch(final core::Object _) {
    return;
  }
  throw "Expected exception";
}
