Download presentation
Presentation is loading. Please wait.
Published byJakob Marvin Modified over 9 years ago
1
Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus
2
Wildcards ● Genericity – Improves type system expressiveness – Based on parametric abstraction ● The abstraction gap: – Clashes with object-oriented (subtype) abstraction ● Wildcards – Mediate the two modes of abstraction – Address deep type-theoretic issues
3
The Wildcards Project ● University of Aarhus – Mads Torgersen, Erik Ernst, Peter von der Ahé and Christian Plesner Hansen ● Sun Microsystems – Gilad Bracha and Neal Gafter ● Based on previous research by – Mads Torgersen & Kresten Krab Thorup – Mirko Viroli & Atsushi Igarashi
4
Project Results ● Design of the wildcard mechanism – Mediation of the abstraction gap – Integration with other language features ● Implementation – javac, the Java compiler – Java Platform APIs ● Part of JDK1.5 (Tiger)
5
Java Genericity interface List extends Collection { void add(Object element); Object get(int index);... }
6
Java Genericity interface List extends Collection { void add(Object element); Object get(int index);... } List numbers = new ArrayList(); numbers.add(new Integer(7)); Number n = (Number)numbers.get(0);
7
Java Genericity List numbers = new ArrayList(); numbers.add(new Integer(7)); Number n = (Number)numbers.get(0); interface List extends Collection { void add(T element); T get(int index);... }
8
Java Genericity interface List extends Collection { void add(T element); T get(int index);... } List numbers = new ArrayList (); numbers.add(new Integer(7)); Number n = numbers.get(0);
9
Static typecheck List numbers =... numbers.add(”Seven”); Number n = numbers.get(0); List numbers =... numbers.add(”Seven”); Number n = (Number)numbers.get(0);
10
Static typecheck List numbers =... numbers.add(”Seven”); Number n = numbers.get(0); List numbers =... numbers.add(”Seven”); Number n = (Number)numbers.get(0); Runtime type error!
11
Static typecheck List numbers =... numbers.add(”Seven”); Number n = numbers.get(0); List numbers =... numbers.add(”Seven”); Number n = (Number)numbers.get(0); Compile time error
12
Object-Oriented Abstraction Common view on common properties Collection List Set
13
Object-Oriented Abstraction Common view on common properties Collection List Set List l =...; Collection c = l;
14
Object-Oriented Abstraction Pointwise subtyping Collection List Set List nl =...; Collection nc = nl;
15
Parametric Abstraction What is the common view? List ?
16
In the ”old” days......any List was just a List List List numbers =...; List things = numbers; things.add(”Seven”); Number n = (Number)number.get(0);
17
In the ”old” days......any List was just a List List List numbers =...; List things = numbers; things.add(”Seven”); Number n = (Number)number.get(0); Runtime type error!
18
Number[] numbers =...; Object[] things = numbers; things[0] = ”Seven”; Number n = numbers[0]; The Array approach Runtime store check on every assignment Object[] Number[] String[]
19
Number[] numbers =...; Object[] things = numbers; Things[0] = ”Seven”; Number n = numbers[0]; The Array approach Runtime store check on every assignment Object[] Number[] String[] Runtime type error!
20
Can we do the same for List? List List numbers =...; List things = numbers; things.add(”Seven”); Number n = numbers.get(0); Runtime type error? ?
21
Can we do the same for List? Erasure: No type argument info at runtime List List numbers =...; List things = numbers; things.add(”Seven”); Number n = numbers.get(0); Runtime type error? ?
22
Can we do the same for List? Erasure: No type argument info at runtime List List numbers =...; List things = numbers; things.add(”Seven”); Number n = numbers.get(0); Runtime type error!
23
Can we do the same for List? No type argument info at runtime List List numbers =...; List things = numbers; things.add(”Seven”); Number n = numbers.get(0); Compile time error!
24
The raw types approach List List numbers =...; List things = numbers; things.add(”Seven”); Number n = numbers.get(0); ?
25
The raw types approach Compile time type check undermined List List numbers =...; List things = numbers; things.add(”Seven”); Number n = numbers.get(0); Runtime type error! ?
26
The raw types approach Compile time type check undermined List List numbers =...; List things = numbers; things.add(”Seven”); Number n = numbers.get(0); Compile time warning
27
The raw types approach Compile time type check undermined List List numbers =...; List things = numbers; things.add(”Seven”); Number n = numbers.get(0); Compile time warning
28
The GJ approach Object List List numbers =...; Object things = numbers; things.add(”Seven”); Object o = things.get(0);
29
The GJ approach Object List List numbers =...; Object things = numbers; things.add(”Seven”); Object o = things.get(0); Compile time error!
30
The GJ approach Cannot use common interface Object List List numbers =...; Object things = numbers; things.add(”Seven”); Object o = things.get(0); Compile time error!
31
The GJ approach Cannot use common interface Object List List numbers =...; Object things = numbers; things.add(”Seven”); Object o = things.get(0); Compile time error!
32
Requirements for a common view ● It should be some kind of List – so that we can safely get elements out of it ● It should prevent insertion of wrong elements – to avoid heap pollution ● It should do so at compile time – because we have no runtime type argument info ● It must prevent insertion of any elements – because it is a share view of all Lists
33
Wildcards ”List of something ” List ?
34
Wildcards ”List of something ” List ?
35
Wildcards ”List of something ” List List numbers =...; List things = numbers; things.add(”Seven”); Object o = things.get(0);
36
Wildcards ”List of something ” List List numbers =...; List things = numbers; things.add(”Seven”); Object o = things.get(0);
37
Wildcards in Collections package java.util; public interface Collection { boolean containsAll(Collection c); boolean removeAll(Collection c);... }
38
Can we do better? Integer and Float are related List
39
Bounded Wildcards Numbers come out List List ints =...; List numbers = ints; Number n = numbers.get(0); numbers.add(.7F);
40
Bounded Wildcards Adding still prohibited List List ints =...; List numbers = ints; Number n = numbers.get(0); numbers.add(.7F);
41
Extends-bounds in Collections package java.util; public interface Collection { boolean containsAll(Collection c); boolean removeAll(Collection c); boolean addAll(Collection c);... }
42
What can we do about adding? Adding still prohibited List
43
Super-bounded Wildcards List List numbers =...; List ints = numbers; ints.add(7); Integer i = ints.get(0);
44
Super-bounded Wildcards Only Objects come out List List numbers =...; List ints = numbers; ints.add(7); Integer i = ints.get(0);
45
TreeSet Constructors package java.util; public class TreeSet implements OrderedSet { public TreeSet(OrderedSet c); public TreeSet(Collection c); public TreeSet(Comparator c);... }
46
Collections utility methods package java.util; public class Collections { public static void reverse(List list); public static void shuffle(List list); public static void fill( List list, T obj); public static void copy( List dest, List src);... } T
47
Subtyping with wildcards List
48
Subtyping with wildcards List
49
Type inference Better types to choose from T choose(T fst, T snd) {... } List numbers =... Set strings =... Collection c = choose(numbers,strings)
50
Type inference Built-in condition expression Boolean b =... List numbers =... Set strings =... Collection c = b ? numbers : strings
51
Capture package java.util; public class Collections { public static void reverse(List list); public static void shuffle(List list); public static void fill( List list, T obj); public static void copy( List dest, List src);... }
52
Capture package java.util; public class Collections { public static void reverse(List list); public static void shuffle(List list); public static void fill( List list, T obj); public static void copy( List dest, List src);... } How is reverse() implemented?
53
Capture public static void reverse(List list) { rev(list); } private static void rev(List list) { for (int i = 0; i < list.length/2; i++) { int j = list.length - i - 1; T tmp = list.get(i); list.set(i, list.get(j)); list.set(j, tmp); }
54
Capture public static void reverse(List list) { rev(list); } private static void rev(List list) { for (int i = 0; i < list.length/2; i++) { int j = list.length - i - 1; T tmp = list.get(i); list.set(i, list.get(j)); list.set(j, tmp); } Capture
55
Wildcard conclusions ● Bridges the gap between object-oriented and polymorphic abstraction ● Simpler and more precise signatures ● Better type inference ● All over the JDK 5 APIs http://java.sun.com/j2se/1.5.0
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.