Top Banner
<?> <?> <?> <?> <?> <?> <?> Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus
55

Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

Dec 15, 2015

Download

Documents

Jakob Marvin
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Wildcards

in the Java™ Programming Language

Neal Gafter

with thanks to

Mads Torgersen, University of Aarhus

Page 2: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>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

Page 3: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>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

Page 4: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>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)

Page 5: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Java Genericity

interface List extends Collection { void add(Object element); Object get(int index); ...}

Page 6: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>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);

Page 7: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Java Genericity

List numbers = new ArrayList();numbers.add(new Integer(7));Number n = (Number)numbers.get(0);

interface List<T> extends Collection<T> { void add(T element); T get(int index); ...}

Page 8: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Java Genericity

interface List<T> extends Collection<T> { void add(T element); T get(int index); ...}

List<Number> numbers = new ArrayList<Number>();numbers.add(new Integer(7));Number n = numbers.get(0);

Page 9: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Static typecheck

List<Number> numbers = ...numbers.add(”Seven”);Number n = numbers.get(0);

List numbers = ...numbers.add(”Seven”);Number n = (Number)numbers.get(0);

Page 10: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Static typecheck

List<Number> numbers = ...numbers.add(”Seven”);Number n = numbers.get(0);

List numbers = ...numbers.add(”Seven”);Number n = (Number)numbers.get(0);

Runtime type error!

Page 11: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Static typecheck

List<Number> numbers = ...numbers.add(”Seven”);Number n = numbers.get(0);

List numbers = ...numbers.add(”Seven”);Number n = (Number)numbers.get(0);

Compile time error

Page 12: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Object-Oriented Abstraction

Common view on common properties

Collection

ListSet

Page 13: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Object-Oriented Abstraction

Common view on common properties

Collection

ListSet

List l = ...;Collection c = l;

Page 14: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Object-Oriented Abstraction

Pointwise subtyping

Collection<Number>

List<Number>Set<Number>

List<Number> nl = ...;Collection<Number> nc = nl;

Page 15: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Parametric Abstraction

What is the common view?

List<Number>List<String>

?

Page 16: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>In the ”old” days...

...any List was just a List

List

ListList

List numbers = ...;List things = numbers;things.add(”Seven”);Number n = (Number)number.get(0);

Page 17: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>In the ”old” days...

...any List was just a List

List

ListList

List numbers = ...;List things = numbers;things.add(”Seven”);Number n = (Number)number.get(0);

Runtime type error!

Page 18: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>

Number[] numbers = ...;Object[] things = numbers; things[0] = ”Seven”;Number n = numbers[0];

The Array approach

Runtime store check on every assignmentObject[]

Number[]String[]

Page 19: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>

Number[] numbers = ...;Object[] things = numbers; Things[0] = ”Seven”;Number n = numbers[0];

The Array approach

Runtime store check on every assignmentObject[]

Number[]String[]

Runtime type error!

Page 20: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Can we do the same for List?

List<Object>

List<Number>List<String>

List<Number> numbers = ...;List<Object> things = numbers; things.add(”Seven”);Number n = numbers.get(0);

Runtime type error?

?

Page 21: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Can we do the same for List?

Erasure: No type argument info at runtime

List<Object>

List<Number>List<String>

List<Number> numbers = ...;List<Object> things = numbers; things.add(”Seven”);Number n = numbers.get(0);

Runtime type error?

?

Page 22: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Can we do the same for List?

Erasure: No type argument info at runtime

List<Object>

List<Number>List<String>

List<Number> numbers = ...;List<Object> things = numbers; things.add(”Seven”);Number n = numbers.get(0);

Runtime type error!

Page 23: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Can we do the same for List?

No type argument info at runtime

List<Object>

List<Number>List<String>

List<Number> numbers = ...;List<Object> things = numbers; things.add(”Seven”);Number n = numbers.get(0);

Compile time error!

Page 24: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>The raw types approach

List

List<Number>List<String>

List<Number> numbers = ...; List things = numbers; things.add(”Seven”);Number n = numbers.get(0);

?

Page 25: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>The raw types approach

Compile time type check undermined

List

List<Number>List<String>

List<Number> numbers = ...; List things = numbers; things.add(”Seven”);Number n = numbers.get(0);

Runtime type error!

?

Page 26: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>The raw types approach

Compile time type check undermined

List

List<Number>List<String>

List<Number> numbers = ...; List things = numbers; things.add(”Seven”);Number n = numbers.get(0);

Compile time warning

Page 27: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>The raw types approach

Compile time type check undermined

List

List<Number>List<String>

List<Number> numbers = ...; List things = numbers; things.add(”Seven”);Number n = numbers.get(0);

Compile time warning

Page 28: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>The GJ approach

Object

List<Number>List<String>

List<Number> numbers = ...;Object things = numbers; things.add(”Seven”);Object o = things.get(0);

Page 29: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>The GJ approach

Object

List<Number>List<String>

List<Number> numbers = ...;Object things = numbers; things.add(”Seven”);Object o = things.get(0);

Compile time error!

Page 30: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>The GJ approach

Cannot use common interface

Object

List<Number>List<String>

List<Number> numbers = ...;Object things = numbers; things.add(”Seven”);Object o = things.get(0);

Compile time error!

Page 31: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>The GJ approach

Cannot use common interface

Object

List<Number>List<String>

List<Number> numbers = ...;Object things = numbers; things.add(”Seven”);Object o = things.get(0);

Compile time error!

Page 32: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>

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

Page 33: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Wildcards

”List of something ”

List< >

List<Number>List<String>

?

Page 34: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Wildcards

”List of something ”

List< >

List<Number>List<String>

?

Page 35: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Wildcards

”List of something ”

List<?>

List<Number>List<String>

List<Number> numbers = ...;List<?> things = numbers; things.add(”Seven”);Object o = things.get(0);

Page 36: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Wildcards

”List of something ”

List<?>

List<Number>List<String>

List<Number> numbers = ...;List<?> things = numbers; things.add(”Seven”);Object o = things.get(0);

Page 37: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Wildcards in Collections

package java.util;

public interface Collection<E> { boolean containsAll(Collection<?> c); boolean removeAll(Collection<?> c); ...}

Page 38: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Can we do better?

Integer and Float are related

List<?>

List<Integer>List<Float>

Page 39: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Bounded Wildcards

Numbers come out

List<? extends Number>

List<Integer>List<Float>

List<Integer> ints = ...;List<? extends Number> numbers = ints;Number n = numbers.get(0);numbers.add(.7F);

Page 40: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Bounded Wildcards

Adding still prohibited

List<? extends Number>

List<Integer>List<Float>

List<Integer> ints = ...;List<? extends Number> numbers = ints;Number n = numbers.get(0);numbers.add(.7F);

Page 41: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Extends-bounds in Collections

package java.util;

public interface Collection<E> {

boolean containsAll(Collection<?> c);

boolean removeAll(Collection<?> c);

boolean addAll(Collection<? extends E> c);

...

}

Page 42: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>

What can we do about adding?

Adding still prohibited

List<? extends Number>

List<Integer>List<Number>

Page 43: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Super-bounded Wildcards

List<? super Integer>

List<Integer>List<Number>

List<Number> numbers = ...;List<? super Integer> ints = numbers;ints.add(7);Integer i = ints.get(0);

Page 44: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Super-bounded Wildcards

Only Objects come out

List<? super Integer>

List<Integer>List<Number>

List<Number> numbers = ...;List<? super Integer> ints = numbers;ints.add(7);Integer i = ints.get(0);

Page 45: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>TreeSet Constructors

package java.util;

public class TreeSet<E>

implements OrderedSet<E> {

public TreeSet(OrderedSet<E> c);

public TreeSet(Collection<? extends E> c);

public TreeSet(Comparator<? super E> c);

...

}

Page 46: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Collections utility methods

package java.util;

public class Collections { public static void reverse(List<?> list); public static void shuffle(List<?> list); public static <T> void fill( List<? super T> list, T obj); public static <T> void copy( List<? super T> dest, List<? extends T> src); ...}

T

Page 47: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Subtyping with wildcards

List<? extends Number>

List<? extends Integer> List<Number>

List<Integer>

List<?>

Page 48: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Subtyping with wildcards

List<? super Integer>

List<? super Number> List<Integer>

List<Number>

List<?>

Page 49: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Type inference

Better types to choose from

<T> T choose(T fst, T snd) { ...}

List<Number> numbers = ...Set<String> strings = ...

Collection<?> c = choose(numbers,strings)

Page 50: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Type inference

Built-in condition expression

Boolean b = ...List<Number> numbers = ...Set<String> strings = ...

Collection<?> c = b ? numbers : strings

Page 51: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Capture

package java.util;

public class Collections { public static void reverse(List<?> list); public static void shuffle(List<?> list); public static <T> void fill( List<? super T> list, T obj); public static <T> void copy( List<? super T> dest, List<? extends T> src); ...}

Page 52: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Capture

package java.util;

public class Collections { public static void reverse(List<?> list); public static void shuffle(List<?> list); public static <T> void fill( List<? super T> list, T obj); public static <T> void copy( List<? super T> dest, List<? extends T> src); ...}

How is reverse() implemented?

Page 53: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Capture

public static void reverse(List<?> list) { rev(list); } private static <T> void rev(List<T> 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); } }}

Page 54: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>Capture

public static void reverse(List<?> list) { rev(list); } private static <T> void rev(List<T> 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

Page 55: Wildcards in the Java™ Programming Language Neal Gafter with thanks to Mads Torgersen, University of Aarhus.

<?>

<?>

<?>

<?>

<?>

<?>

<?>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