interface Ordered { public boolean less(Ordered x); } class OrderedString implements Ordered { String s; OrderedString(String s) { this.s = s; } public boolean less(Ordered t) { return s.compareTo(((OrderedString)t).s) < 0; } } class OrderedInt implements Ordered { int i; OrderedInt(int i) { this.i = i; } public boolean less(Ordered h) { return i < ((OrderedInt)h).i; } } class Person { int date; String name; } abstract class OrderedPerson extends Person implements Ordered { abstract public boolean less(Ordered x); } class OrderedPerson1 extends OrderedPerson { public boolean less(Ordered f) { return date < ((OrderedPerson1)f).date; } } class OrderedPerson2 extends OrderedPerson { public boolean less(Ordered f) { return name.compareTo(((OrderedPerson2)f).name) < 0; } } // Use the class variable datesort to determine the sorting criterion class OrderedPerson3 extends OrderedPerson { public static boolean datesort; public boolean less(Ordered f) { if (datesort) return date < ((OrderedPerson3)f).date; else return name.compareTo(((OrderedPerson3)f).name) < 0; } }