interface Comparable<A> { public int compareTo (A that); } class Byte implements Comparable<Byte> { private byte value; public Byte (byte value) { this.value = value; } public byte byteValue () { return value; } public int compareTo (Byte that) { return this.value - that.value; } } class Lists { public static <A implements Comparable<A>> A max (List<A> xs) { Iterator<A> xi = xs.iterator(); A w = xi.next(); while (xi.hasNext()) { A x = xi.next(); if (w.compareTo(x) < 0) w = x; } return w; } } class Test { public static void main (String[] args) { // byte collection LinkedList<Byte> xs = new LinkedList<Byte>(); xs.add(new Byte(0)); xs.add(new Byte(1)); Byte x = Collections.max(xs); // boolean collection LinkedList<Boolean> ys = new LinkedList<Boolean>(); ys.add(new Boolean(false)); ys.add(new Boolean(true)); Boolean y = Collections.max(ys); // compile-time error } }
Example 4: Code rewritten in GJ.