CSC448: Type Checking Revisited: Generic Polymorphism III [113/133] Previous pageContentsNext page

To confuse the issue, Java v1.5 also includes generic polymorphism, so we can write:

  <A> List<A> reverse2 (List<A> l)
  {
    List<A> result = new ArrayList<A> ();
    Iterator<A> iter = l.iterator ();
    while (iter.hasNext ()) {
      A a = iter.next ();
      result.add (a);
    }
    return result;
  }
        

Code to invoke the two reverse methods:

  void test ()
  {
    List<String> list = new ArrayList<String> ();
    list.add ("the"); list.add ("rain"); list.add ("in"); list.add ("Spain");
    list.add ("falls"); list.add ("mainly"); list.add ("on"); list.add ("the"); list.add ("plain");

    List l1a = reverse1 (list);
    Object o1 = l1a.get (0);
    List<String> l1b = reverse1 (list);
    String s1b = l1b.get (0);
    // Next line fails to typecheck:
    //    String s1c = reverse1 (list).get (0);

    List l2a = reverse2 (list);
    Object o2 = l2a.get (0);
    List<String> l2b = reverse2 (list);
    String s2b = l2b.get (0);
    String s2c = reverse2 (list).get (0);

    // Type inference means that we don't have to type:
    List<String> l2d = this.<String>reverse2 (list);
  }
        

Previous pageContentsNext page