[email protected] 1 a model for java with wildcards nicholas cameron sophia drossopoulou erik...

78
[email protected] 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Upload: bruno-walford

Post on 31-Mar-2015

212 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

[email protected] 1

A Model for Java with Wildcards

Nicholas CameronSophia Drossopoulou

Erik Ernst

Page 2: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

[email protected] 2

• Background• Wildcards• Previous attempts• Existential types• Subtyping• Typing

Page 3: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

[email protected] 3

Background

Page 4: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

• Java 5.0• 2004

• Adding Wildcards to the Java LanguageTorgersen, Ernst, Plesner Hansen, von der Ahé, Bracha, Gafter. SAC 04.

• Existential types to model wildcards

[email protected] 4

Page 5: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

• Wild FJTorgersen, Ernst, Plesner Hansen. FOOL 05.

• ‘On the fly’ existential types• No soundness proof

• JCameron, Ernst, Drossopoulou. FtfJP 07.

• Explicit existential types• Explicit open/close expressions• Partial model

• Variant Parametric TypesIgarashi, Viroli. ECOOP 02, TOPLAS 06.

• Partial model• No capture conversion

[email protected] 5

Page 6: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

• On Decidability of Nominal Subtyping with Variance Kennedy, Pierce. FOOL 07.

• Variance and Generalized Constraints for C# Generics

Emir, Kennedy, Russo, Yu. ECOOP 06

• Typeless Programming in Java 5.0Plümicke, Bäuerle. PPPJ 06

• A Flow-Based Approach for Variant Parametric Types

Chin, Craciun, Khoo, Popeea. OOPSLA 06.

• Subtyping Existential TypesWeir, Theimann. FTfJP 08.

[email protected] 6

Page 7: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

[email protected]

Wildcards

A very brief description

Page 8: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Java Type

[email protected] 8

Page 9: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Java Generics Type

Cup<Tea>[email protected] 9

Page 10: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Generics - Invariant Subtyping

Cup<Tea> <: Cup<Object>

[email protected] 10

/

Page 11: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Java Wildcards Type

Cup<?>[email protected] 11

Page 12: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Bounds

Cup<? extends Drink>

[email protected] 12

Page 13: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Generics - Invariant Subtyping

Cup<Tea> <: Cup<Object>

[email protected] 13

/

Page 14: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Wildcards - Variant Subtyping

Cup<Tea> <: Cup<Object>

Cup<Tea> <: Cup<?>

Cup<Tea> <:Cup<? extends Drink>

Cup<? extends Tea> <:Cup<? extends Drink>

[email protected] 14

/

Page 15: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Wildcard Capture

void <X> test(Cup<X> cx) {...}

void m(Cup<?> c) {

this.test(c);

}

[email protected] 15

Page 16: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Wildcard Capture

void <X> test(Cup<X> cx) {...}

void m(Cup<?> c) {

this.test(c);

//this.<Z>test(c);

//Z fresh

}

[email protected] 16

Page 17: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Our Previous Attempts

Page 18: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Naïve Approach

Cup<?>

[email protected] 18

Page 19: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Naïve Approach

Cup<?>

[email protected] 19

Expressible but not

denotable types

Page 20: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

'On the fly' Existential Types

capture(Cup<?>) = X.Cup<X>

[email protected] 20

Page 21: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

'On the fly' Existential Types

capture(Cup<?>) = X.Cup<X>

Too complicated

[email protected] 21

Page 22: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Explicit Existential Types

open... close...

[email protected] 22

Page 23: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Explicit Existential Types

open... close...

Lower Bounds

Expressivity

[email protected] 23

Page 24: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Scope Violationvoid m(X.Cup<X> x) { this.<X>m2(x);

}

[email protected] 24

Page 25: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Scope Violationvoid m(X.Cup<X> x) { this.<X>m2(x);

}

Alpha Renaming

[email protected] 25

Page 26: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

...

[email protected] 26

Page 27: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

[email protected]

Modelling Concepts

Page 28: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Tame FJ

Page 29: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

• Explicit existential typesImplicit packing (in subtyping (XS-ENV))

Implicit unpacking (in type rules)

• Inferred type parametersthis.<>m(x);

• Separation of subtypingSubclassing, extended subclassing, subtyping

• Guarding environment... e : T |

Tracks unpacked type variables

[email protected] 29

Page 30: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

[email protected] 30

Existential Types

Page 31: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Cup<?>

X.Cup<X>

[email protected] 31

Page 32: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Cup<? extends Drink>

XDrink.Cup<X>

[email protected] 32

Page 33: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

But Why?

Page 34: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

But Why?

Capture conversion

Expressible but not denotable types

Page 35: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

<X> Pair<X,X> make(List<X> x) {...}

<X> void test (Pair<X, X> x) {...}

void m(List<?> l, Pair<?, ?> p) {

test(p);

}

[email protected] 35

Page 39: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

X.Pair<X,X>

Type is expressible but not denotable

[email protected] 39

Page 40: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

<X> Pair<X,X> make(List<X> x) {...}

<X> void test (Pair<X, X> x) {...}

void m(X.List<X> l, X,Y.Pair<X, Y> p) {

test(p);

test(make(l));

X.Pair<X, X> q = make(l);}

[email protected] 40

Page 41: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

<X> Pair<X,X> make(List<X> x) {...}

<X> void test (Pair<X, X> x) {...}

void m(X.List<X> l, X,Y.Pair<X, Y> p) {

test(p);

test(make(l));

X.Pair<X, X> q = make(l);}

[email protected] 41

Page 42: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

<X> Pair<X,X> make(List<X> x) {...}

<X> void test (Pair<X, X> x) {...}

void m(X.List<X> l, X,Y.Pair<X, Y> p) {

test(p);

test(make(l));

X.Pair<X, X> q = make(l);}

[email protected] 42

Page 43: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

[email protected] 43

Subtyping

Page 44: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Wildcards Subtyping

Cup<Tea> <: Cup<?>

Cup<Tea> <:Cup<? extends Drink>

Cup<? extends Tea> <:Cup<? extends Drink>

[email protected] 44

Page 45: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Wildcards Subtyping

Cup<Tea> <: Cup<?>

.Cup<Tea> <: X.Cup<X>

Cup<Tea> <:Cup<? extends Drink>

.Cup<Tea> <: XDrink.Cup<X>

Cup<? extends Tea> <:Cup<? extends Drink>

YTea.Cup<Y> <: XDrink.Cup<X>

[email protected] 45

Page 46: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

,’ T <: B ’.[T/X]N <:XB.N

(S-ENV)

[email protected] 46

Page 47: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Cup<Tea> <: Cup<?>

.Cup<Tea> <: X.Cup<X>

Tea <: Object

.[Tea/X]Cup<X> <:X.Cup<X>(S-ENV)

[email protected] 47

Page 48: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Cup<Tea> <:Cup<? extends Drink>

.Cup<Tea> <: XDrink.Cup<X>

Tea <: Drink

.[Tea/X]Cup<X> <:XDrink.Cup<X>(S-ENV)

[email protected] 48

Page 49: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Cup<? extends Tea> <:Cup<? extends Drink>

YTea.Cup<Y> <: XDrink.Cup<X>

YTea Y <:Tea <: Drink

YTea.[Y/X]Cup<X> <:XDrink.Cup<X>(S-ENV)

[email protected] 49

Page 50: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

3 flavours of subtyping?

Page 51: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Java 4 Subtyping

[email protected] 51

Object

CoffeeTea

DrinkList

Vector

Page 52: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Java 5 Subtyping

[email protected] 52

Object

CoffeeTea

Drink

ZDrink.List<Z>

Z.List<Z>

List<Tea>

ZDrink.Vector<Z>

Z.Vector<Z>

Vector<Tea>

X

In class C<X extends Tea> ...

ZX.List<Z>

ZX.Vector<Z>

Page 53: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Tame FJ Subclassing

[email protected] 53

Object

CoffeeTea

Drink List<Z>

List<Tea>

Vector<Z>

Vector<Tea>

X

In class C<X extends Tea> ...

Page 54: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Tame FJ Extended Subtyping

[email protected] 54

ZDrink.List<Z>

Z.List<Z>

List<Tea>

ZDrink.Vector<Z>

Z.Vector<Z>

Vector<Tea>

In class C<X extends Tea> ...

ZX.List<Z> ZX.Vector<Z>

Page 55: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Tame FJ Subtyping

Tea

X

In class C<X extends Tea> ...

Page 56: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

TameFJ Subtyping

[email protected] 56

Object

CoffeeTea

Drink

ZDrink.List<Z>

Z.List<Z>

List<Tea>

ZDrink.Vector<Z>

Z.Vector<Z>

Vector<Tea>

X

In class C<X extends Tea> ...

ZX.List<Z>

ZX.Vector<Z>

Page 57: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

But Why?

• Subtyping is too flexible and complicated to use directly in the proofs

• SubclassingProperties of the class hierarchy – e.g., field/method lookup

• Extended SubclassingIf we need wildcard subtyping, but can't deal with lower bounds

E.g., preservation of existential types

• SubtypingStill required – e.g., result of inversion lemmas, due to T-SUBS

[email protected] 57

Page 58: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

[email protected] 58

Typing

Page 62: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

class Cup<X> {

Mug<X> f;

void m(Cup<?> c) {

c.f;

}

}

[email protected] 62

Page 63: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

class Cup<X> {

Mug<X> f;

void m(Cup<?> c) {

c.f;

}

}

X;this:Cup<X> c:Z.Cup<Z> | fType(f, Cup<Z>) = Mug<Z>

[email protected] 63

Page 64: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

class Cup<X> {

Mug<X> f;

void m(Cup<?> c) {

c.f;

}

}

X;this:Cup<X> c:Z.Cup<Z> | fType(f, Cup<Z>) = Mug<Z>

X;this:Cup<X> c.f:Mug<Z> | Z

[email protected] 64

┴┴

Page 65: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

class Cup<X> {

Mug<X> f;

void m(Cup<?> c) {

c.f;

}

}

X;this:Cup<X> c:Z.Cup<Z> | fType(f, Cup<Z>) = Mug<Z>

X;this:Cup<X> c.f:Mug<Z> | Z

[email protected] 65

┴┴

Page 69: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

class Cup<X> {

Mug<X> f;

void m(Cup<?> c) {

c.f;

}

}

X;this:Cup<X> c:Z.Cup<Z> |

fType(f, Cup<Z>) = Mug<Z>

X;this:Cup<X> c.f:Mug<Z> | Z

[email protected] 69┴

Page 70: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

class Cup<X> {

Mug<X> f;

void m(Cup<?> c) {

c.f;

}

}

X;this:Cup<X> c:Z.Cup<Z> |

fType(f, Cup<Z>) = Mug<Z> X;Z Mug<Z> <:Z.Mug<Z>

X;this:Cup<X> c.f:Mug<Z> | Z

[email protected] 70┴

Page 71: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

class Cup<X> {

Mug<X> f;

void m(Cup<?> c) {

c.f;

}

}

X;this:Cup<X> c:Z.Cup<Z> |

fType(f, Cup<Z>) = Mug<Z> X;Z Mug<Z> <:Z.Mug<Z>

X;this:Cup<X> c.f:Mug<Z> | Z X Z.Mug<Z> OK

[email protected] 71┴

Page 72: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

class Cup<X> {

Mug<X> f;

void m(Cup<?> c) {

c.f;

}

}

X;this:Cup<X> c:Z.Cup<Z> |

fType(f, Cup<Z>) = Mug<Z> X;Z Mug<Z> <:Z.Mug<Z>

X;this:Cup<X> c.f:Mug<Z> | Z X Z.Mug<Z> OK

X;this:Cup<X> c.f:Z.Mug<Z> |

[email protected] 72┴

Page 73: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

class Cup<X> {

Mug<X> f;

void m(Cup<?> c) {

c.f;

}

}

X;this:Cup<X> c:Z.Cup<Z> |

fType(f, Cup<Z>) = Mug<Z> X;Z Mug<Z> <:Z.Mug<Z>

X;this:Cup<X> c.f:Mug<Z> | Z X Z.Mug<Z> OK

X;this:Cup<X> c.f:Z.Mug<Z> |

[email protected] 73┴

Page 75: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

• Full model

• Proven sound

• Future Work• ‘More full’ - features, translation• More expressive?• Mechanical proof checking

[email protected] 75

Page 76: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

[email protected] 76

Thank You!

http://www.doc.ic.ac.uk/~ncameron/papers/cameron_ecoop08_full.pdf

Page 77: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

class Cup<X> {

Cup<X> f;

Cup<X> m2(String x) {...}

void m(Cup<?> c) {

c.f = c.f;

c.f = c;

c.f = c.m2(“a string”);

}

}

[email protected] 77

Page 78: Ncameron@doc.ic.ac.uk 1 A Model for Java with Wildcards Nicholas Cameron Sophia Drossopoulou Erik Ernst

Variance in C# and Scala

• C# is invariant, but variance proposed

• Declaration site annotationsLess complex, but less flexible

Vs. use site declaration in Java

class CovariantCup<+X> ...

• Formalisation and soundnessC# - Emir, Kennedy, Russo, Yu. ECOOP 06

Scala - Cremet. PhD Thesis, 06 (Virtual types)

[email protected] 78