/* @flow */ class A { p: T; constructor(p: T) { this.p = p; } } // Test out simple defaults class B extends A {} var b_number: B = new B(123); var b_void: B = new B(); var b_default: B<> = new B('hello'); var b_star: B<*> = new B(123); (b_number.p: boolean); // Error number ~> boolean (b_void.p: boolean); // Error void ~> boolean (b_default.p: boolean); // Error string ~> boolean (b_star.p: boolean); // Error number ~> boolean class C extends A {} var c_number: C = new C(123); // Error number ~> ?string var c_void: C = new C(); var c_default: C<> = new C('hello'); var c_star: C<*> = new C('hello'); (c_void.p: boolean); // Error void ~> boolean (c_default.p: boolean); // Error string ~> boolean (c_star.p: boolean); // Error string ~> boolean class D extends A {} var d_number: D = new D(123); var d_void: D = new D(); var d_default: D = new D('hello'); var d_too_few_args: D<> = new D('hello'); // Error too few tparams var d_too_many: D = new D('hello'); // Error too many tparams var d_star: D<*> = new D(10); // error, number ~> string (d_number.p: boolean); // Error number ~> boolean (d_void.p: boolean); // Error void ~> boolean (d_default.p: boolean); // Error string ~> boolean (d_star.p: boolean); // Error number ~> boolean class E {} // Error: string ~> number class F {} // Error: number ~> string class G extends A {} var g_default: G = new G('hello'); (g_default.p: boolean); // Error string ~> boolean class H {} // Error - can't refer to T before it's defined class I extends A {} var i_number: I = new I(123); // Error number ~> ?string var i_void: I = new I(); var i_default: I<> = new I('hello'); var i_star: I<*> = new I('hello');