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

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

Mar 31, 2015

Download

Documents

Bruno Walford
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: 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