import java.util.*; class G23 { static class Person implements Comparable<Person> { final String name; Person( String name ){ this.name = name; } public int compareTo( Person p ){ return name.compareTo(p.name); } } static class Driver extends Person { Driver( String name ){ super(name); } } static class PersonComparator implements Comparator<Person> { public int compare( Person a, Person b ){ return a.name.compareTo(b.name); } } public static <E extends Comparable<? super E>> E max( Collection<E> c ){ //public static <E extends Comparable<? super E>> E max( Collection<? extends E> c ){ Iterator<E> it = c.iterator(); E m = it.next(); while( it.hasNext() ){ E e = it.next(); if( m.compareTo(e) < 0 ){ m = e; } } return m; } public static <T> T max( Collection<T> c, Comparator<? super T> comp ){ //public static <T> T max( Collection<? extends T> c, Comparator<? super T> comp ){ Iterator<T> it = c.iterator(); T m = it.next(); while( it.hasNext() ){ T e = it.next(); if( comp.compare(m,e) < 0 ){ m = e; } } return m; } public static void main( String[] args ){ PersonComparator pc = new PersonComparator(); Driver d; List<? extends Driver> lu = new ArrayList<Driver>(); d = max(lu, pc); // wildcard capture Collection<Collection<? extends Person>> cc = new LinkedList<Collection<? extends Person>>(); for( Collection<? extends Person> c: cc ){ System.out.println( max(c) ); // wildcard capture } } }