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
    }

  } 

}