package unit; @:generic class MyGeneric { public var t:T; public function new(t:T) { this.t = t; } } @:generic class MyGeneric2 extends T { //public function new() { } // not allowed } class MyRandomClass { public var s:String; public function new(s:String) { this.s = s; } } class MyRandomEmptyClass { } @:generic class RBNode> { public var rbLeft : T; public var rbRight : T; } @:generic class RBTree> { public var root : T; public function new() { } } class MyData extends RBNode { var id : Int; public function new(id:Int) { this.id = id; } } class TestGeneric extends Test { function testBasic() { var mg = new MyGeneric(12); eq(mg.t, 12); t(Std.is(mg.t, Int)); var mg = new MyGeneric("12"); eq(mg.t,"12"); t(Std.is(mg.t, String)); } function testExtends() { // basic class //t(unit.TestType.typeError(new MyGeneric2())); // not a class //t(unit.TestType.typeError(new MyGeneric2())); // no constructor //t(unit.TestType.typeError(new MyGeneric2())); var mg = new MyGeneric2("foo"); eq("foo", mg.s); var mg = new MyGeneric2>(new MyRandomClass("foo")); eq("foo", mg.t.s); } function testConstraints() { var n = new RBTree(); n.root = new MyData(1); n.root.rbLeft = new MyData(2); n.root.rbRight = new MyData(3); } }