import io:*; obj NoTraits {}; obj Trait1 (FirstTrait) {}; obj Trait2 (SecondTrait) {}; obj TwoTrait (FirstTrait, SecondTrait) {}; obj AlreadySpecilized (FirstTrait, SecondTrait) {}; fun OneTwoFunc(obj: T): void { println("No Traits"); } fun OneTwoFunc(obj: T): void { println("First Trait"); } fun OneTwoFunc(obj: T): void { println("Second Trait"); } fun OneTwoFunc(obj: T): void { println("Both Traits"); } //This should work for objects too! //To test, we cycle the mapping of traits obj OneTwoObj (FirstTrait) {}; obj OneTwoObj (SecondTrait) {}; obj OneTwoObj (FirstTrait, SecondTrait) {}; obj OneTwoObj {}; fun main(): int { var a: NoTraits; var b: Trait1; var c: Trait2; var d: TwoTrait; var e: AlreadySpecilized; var f: *TwoTrait; OneTwoFunc(a); OneTwoFunc(b); OneTwoFunc(c); OneTwoFunc(d); OneTwoFunc<*TwoTrait>(f); println(); OneTwoFunc(a); OneTwoFunc(b); OneTwoFunc(c); OneTwoFunc(d); OneTwoFunc(f); println(); var alpha: OneTwoObj; var beta: OneTwoObj; var gamma: OneTwoObj; var delta: OneTwoObj; var zeta: OneTwoObj<*TwoTrait>; OneTwoFunc>(alpha); OneTwoFunc>(beta); OneTwoFunc>(gamma); OneTwoFunc>(delta); OneTwoFunc>(zeta); println() OneTwoFunc(alpha); OneTwoFunc(beta); OneTwoFunc(gamma); OneTwoFunc(delta); OneTwoFunc(zeta); //We can't pass along our inner part, so let's just make sure that it is the right object. //epsilon.proveSpecilized(); return 0; }