CSC448: Type Checking Revisited: Generic Polymorphism III [113/133] |
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); }