java wildcards meet definition-site...

58
Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis John Altidor 1 Christoph Reichenbach 2,1 Yannis Smaragdakis 3,1 Java Wildcards Meet Definition-Site Variance 1 University of Massachusetts 2 Google 3 University of Athens

Upload: others

Post on 10-Mar-2021

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

John Altidor1

Christoph Reichenbach2,1

Yannis Smaragdakis3,1

Java Wildcards MeetDefinition-Site Variance

1University of Massachusetts2Google

3University of Athens

Page 2: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

2Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Outline

� Motivation for Variance.

� Brief History, Existing Approaches.

� What Is New Here:Combine Definition-Site and Use-Site Variance.

• Both in a single language, each using the other

• VarJ Formal Calculus

• Insights on Formal Reasoning

� Summary.

Page 3: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

3Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Subtyping – Inclusion Polymorphism

� Promotes reusability.

� Example: Java inheritance.

class Animal {

void speak() { }

}

class Dog extends Animal {

void speak() { print(“bark”); }

}

class Cat extends Animal {

void speak() { print(“meow”); }

}

Page 4: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

4Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Generics – Parametric Polymorphism

class List<X>

{

void add(X x) { … }

X get(int i) { … }

int size() { … }

}

type parameter

� List<Animal> ≡ List of Animals

� List<Dog> ≡ List of Dogs

Page 5: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

5Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Generics – Parametric Polymorphism

class List<X>

{

void add(X x) { … }

X get(int i) { … }

int size() { … }

}

type parameter

� List<Animal> ≡ List of Animals

� List<Dog> ≡ List of Dogs

write X

Page 6: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

6Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Generics – Parametric Polymorphism

class List<X>

{

void add(X x) { … }

X get(int i) { … }

int size() { … }

}

type parameter

� List<Animal> ≡ List of Animals

� List<Dog> ≡ List of Dogs

write X

read X

Page 7: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

7Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Generics – Parametric Polymorphism

class List<X>

{

void add(X x) { … }

X get(int i) { … }

int size() { … }

}

type parameter

� List<Animal> ≡ List of Animals

� List<Dog> ≡ List of Dogs

write X

read X

no X

Page 8: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

8Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Generics – Parametric Polymorphism

class List<X>

{

void add(X x) { … }

X get(int i) { … }

int size() { … }

}

type parameter

� List<Animal> ≡ List of Animals

� List<Dog> ≡ List of Dogs

CustomizedLists

write X

read X

no X

Page 9: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

9Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Generics and Subtyping

� Dog <: Animal (Dog is an Animal).

� Cat <: Animal (Cat is an Animal).

� List<Dog> <: List<Animal>

Page 10: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

10Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Generics and Subtyping

� Dog <: Animal (Dog is an Animal).

� Cat <: Animal (Cat is an Animal).

� List<Dog> <: List<Animal>

No!

� A List<Animal> can add a Cat to itself.A List<Dog> cannot.

Page 11: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

11Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Variance Introduction

� When is C<Expr1> a subtype of C<Expr2>?

class RList<X>

{

X get(int i) { … }

int size() { … }

}

Can readfrom

but not write to.

� It is safe to assumeRList<Dog> <: RList<Animal>.

� Why?

Page 12: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

12Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Flavors of Variance - Covariance

Generic<Dog> Generic<Animal>

Covariance

<:

� Assuming Dog <: Animal (Dog is an Animal).

Page 13: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

13Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Flavors of Variance - Contravariance

Generic<Animal> Generic<Dog>

Contravariance

<:

� Assuming Dog <: Animal (Dog is an Animal).

Page 14: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

14Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Four Flavors of Variance

� How do programmers specify variance?

Covariance: T <: U ⇒ C<T> <: C<U>.

Contravariance: T <: U ⇒ C<U> <: C<T>.

Bivariance: C<T> <: C<U>, for all T and U.

Invariance: C<T> <: C<U>, if T <: U and U <: T.

Page 15: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

15Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Definition-Site Variance (C#/ Scala)

� Programmer specifies variance in definition as in Scala and C#.

� Variance of a type position.

• Return types: covariant.

• Arguments types: contravariant.

class RList<+X> {

X get(int i) { … }

int size() { … }

// no method to add

}

class WList<-X> {

void add(X x) { … }

int size() { … }

// no method to get

}

Page 16: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

16Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Definition-Site Variance (C#/ Scala)

� Programmer specifies variance in definition as in Scala and C#.

� Variance of a type position.

• Return types: covariant.

• Arguments types: contravariant.

class RList<+X> {

X get(int i) { … }

int size() { … }

// no method to add

}

class WList<-X> {

void add(X x) { … }

int size() { … }

// no method to get

}

Page 17: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

17Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Definition-Site Variance (C#/ Scala)

� Programmer specifies variance in definition as in Scala and C#.

� Variance of a type position.

• Return types: covariant.

• Arguments types: contravariant.

class RList<+X> {

X get(int i) { … }

int size() { … }

// no method to add

}

class WList<-X> {

void add(X x) { … }

int size() { … }

// no method to get

}

Page 18: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

18Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Definition-Site Variance (C#/ Scala)

� Programmer specifies variance in definition as in Scala and C#.

� Variance of a type position.

• Return types: covariant.

• Arguments types: contravariant.

class RList<+X> {

X get(int i) { … }

int size() { … }

// no method to add

}

class WList<-X> {

void add(X x) { … }

int size() { … }

// no method to get

}

Page 19: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

19Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Use-Site Variance (Java Wildcards)

class List<X>

{

void add(X x) { … }

X get(int i) { … }

int size() { … }

}

Page 20: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

20Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Use-Site Variance (Java Wildcards)

class List<X>

{

void add(X x) { … }

X get(int i) { … }

int size() { … }

}

List<? extends X>

Page 21: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

21Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Use-Site Variance (Java Wildcards)

class List<X>

{

void add(X x) { … }

X get(int i) { … }

int size() { … }

}

List<? super X>

Page 22: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

22Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Use-Site Variance (Java Wildcards)

class List<X>

{

void add(X x) { … }

X get(int i) { … }

int size() { … }

}

List<?>

Page 23: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

23Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Brief History: Definition-Site Variance

� Variance has been subject of many (ECOOP) papers.

� Definition-site variance has long history.

• Introduced in late 80’s:

• Cook, ECOOP ’89.

• America & van der Linden, ECOOP ’90.

• Bracha & Griswold, OOPSLA, ’93.

• Formalized for C#: Emir et al, ECOOP ’06.

• Decidability of subtyping w/ variance:Kennedy & Pierce, FOOL ’07.

• Undecidable in general. Decidable fragment.

Page 24: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

24Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Brief History: Use-Site Variance

� Introduced: Thorup & Torgersen, ECOOP ’99.

� Generalized and formalized:Igarashi & Viroli, ECOOP ‘02.

� Adopted by Java as Wildcards: Torgersen et al, SAC ’04.

� Soundness of Java Wildcards: Cameron et al, ECOOP ‘08.

� Decidability still open:Kennedy & Pierce, FOOL ‘07.

� Decidable fragment: Tate et al, PLDI ’11.

Page 25: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

25Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Definition-Site vs. Use-Site Variance

� Definition-Site Cons:

• Redundant Types:

• scala.collection.immutable.Map<A, +B>

• scala.collection.mutable.Map<A, B>

• Generic with n parameters ⇒ 3n interfaces (or 4n

if bivariance is allowed).

� Use-Site Variance Cons:

• Type signatures quickly become complicated.

Iterator<? extends Map.Entry<? extends K, V>>

createEntrySetIterator(

Iterator<? extends Map.Entry<? extends K, V>>)

Page 26: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

26Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Wildcards Criticism

� “We simply cannot afford another wildcards” – Joshua Bloch.

� “Simplifying Java Generics by Eliminating Wildcards” – Howard Lovatt.

Iterator<? extends Map.Entry<? extends K, V>>

createEntrySetIterator(

Iterator<? extends Map.Entry<? extends K, V>>)

Page 27: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

27Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Our Approach: Take Best of Both Worlds

� Take advantages. Remove disadvantages.

• Simpler type expressions in Java (burden off clients).

• Less redundant type definitions in C# and Scala.

� Adding explicit definition-site annotations to Java.

� VarJ Calculus.

• Directly extends TameFJ with definition-site variance.

� Extends denotational approach:PLDI 2011 (Altidor, Huang, Smaragdakis)

Page 28: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

28Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Fewer Wildcard Annotations

Iterator<? extends Map.Entry<? extends K, V>>

createEntrySetIterator(

Iterator<? extends Map.Entry<? extends K, V>>)

Iterator<Map.Entry<K, V>>

createEntrySetIterator(

Iterator<Map.Entry<K, V>>)

Page 29: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

29Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Extending Java with Definition-Site Variance

� Both kinds of annotations: easier for programmer, harder to typecheck

class ROStack1<+X> {

X pop() { ... }

List<? extends X> toList() {... }

}

Page 30: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

30Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Extending Java with Definition-Site Variance

� Both kinds of annotations: easier for programmer, harder to typecheck

class ROStack1<+X> {

X pop() { ... }

List<? extends X> toList() {... }

}

Page 31: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

31Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Extending Java with Definition-Site Variance

� Both kinds of annotations: easier for programmer, harder to typecheck

class ROStack1<+X> {

X pop() { ... }

List<? extends X> toList() {... }

}

Page 32: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

32Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Extending Java with Definition-Site Variance

� Both kinds of annotations: easier for programmer, harder to typecheck

class ROStack1<+X> {

X pop() { ... }

List<? extends X> toList() {... }

}

class ROStack2<+X> {

X pop() { ... }

<Y extends X> List<Y> toList() { ... }

}

Method Type Parameter

Page 33: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

33Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Extending Java with Definition-Site Variance

� Both kinds of annotations: easier for programmer, harder to typecheck

class ROStack1<+X> {

X pop() { ... }

List<? extends X> toList() {... }

}

class ROStack2<+X> {

X pop() { ... }

<Y extends X> List<Y> toList() { ... }

}

Method Type Parameter

Page 34: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

34Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

VarJ: Java Calculus modeling Wildcards and Definition-Site Variance

� Adding explicit definition-site annotations to Java.

• Directly extends TameFJ with definition-site variance.

� Supports full complexities of the Java realization of variance.

• Existential Types

• Polymorphic Methods

• Wildcard Capture

• F-Bounded Polymorphism

� Type Stack<? extends String> modeled as∃∃∃∃X->[⊥⊥⊥⊥-String].Stack<X>.

Page 35: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

35Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

VarJ: Java Calculus modeling Wildcards and Definition-Site Variance

� Adding explicit definition-site annotations to Java.

• Directly extends TameFJ with definition-site variance.

� Supports full complexities of the Java realization of variance.

• Existential Types

• Polymorphic Methods

• Wildcard Capture

• F-Bounded Polymorphism

� Type Stack<? extends String> modeled as∃∃∃∃X->[⊥⊥⊥⊥-String].Stack<X>.

modeled as unknown (existential) type with lower and upper bound

Page 36: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

36Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Standard Modeling: Variance Lattice

� Ordered by subtype constraint (convention: also consider variances to be binary predicates).

Page 37: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

37Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Variance of a Type

� When is C<Expr1> a subtype of C<Expr2>?

� What about existential types?∃∃∃∃X->[⊥⊥⊥⊥-String].Stack<X>

� We answer more general question:When is [U/X]T <: [U’/X]T?

� Key: defined very general predicate:

var(X; T)

= variance of type T with respect to type variable X.

Page 38: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

38Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Variance of a Type

� When is C<Expr1> a subtype of C<Expr2>?

� What about existential types?∃∃∃∃X->[⊥⊥⊥⊥-String].Stack<X>

� We answer more general question:When is [U/X]T <: [U’/X]T?

� Key: defined very general predicate:

var(X; T)

= variance of type T with respect to type variable X.

Page 39: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

39Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Variance of a Type

� When is C<Expr1> a subtype of C<Expr2>?

� What about existential types?∃∃∃∃X->[⊥⊥⊥⊥-String].Stack<X>

� We answer more general question:When is [U/X]T <: [U’/X]T?

� Key: defined very general predicate:

var(X; T)

= variance of type T with respect to type variable X.

Page 40: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

40Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Variance of a Type

� When is C<Expr1> a subtype of C<Expr2>?

� What about existential types?∃∃∃∃X->[⊥⊥⊥⊥-String].Stack<X>

� We answer more general question:When is [U/X]T <: [U’/X]T?

� Key: defined very general predicate:

var(X; T)

= variance of type T with respect to type variable X.

Page 41: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

41Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Subtype Lifting Lemma

If:

(a) v ≤ var(X; T)(b) v(U; U’)

Then: [U/X]T <: [U’/X]T

� var(X; Iterator<X>) = +and +(Dog; Animal) ≡ Dog <: Animal

implies Iterator<Dog> <: Iterator<Animal>

� We generalize Emir et al.’s subtype lifting lemma.

� Goal property of var.

Page 42: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

42Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Subtype Lifting Lemma

If:

(a) v ≤ var(X; T)(b) v(U; U’)

Then: [U/X]T <: [U’/X]T

� var(X; Iterator<X>) = +and +(Dog; Animal) ≡ Dog <: Animal

implies Iterator<Dog> <: Iterator<Animal>

� We generalize Emir et al.’s subtype lifting lemma.

� Goal property of var.

Page 43: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

43Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Subtype Lifting Lemma

If:

(a) v ≤ var(X; T)(b) v(U; U’)

Then: [U/X]T <: [U’/X]T

� var(X; Iterator<X>) = +and +(Dog; Animal) ≡ Dog <: Animal

implies Iterator<Dog> <: Iterator<Animal>

� We generalize Emir et al.’s subtype lifting lemma.

� Goal property of var.

Page 44: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

44Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Subtype Lifting Lemma

If

(a) v ≤ var(X; T)(b) v(U; U’)

Then: [U/X]T <: [U’/X]T

� var(X; Iterator<X>) = +and +(Dog; Animal) ≡ Dog <: Animal

implies Iterator<Dog> <: Iterator<Animal>

� We generalize Emir et al.’s subtype lifting lemma.

� Goal property of var.

Page 45: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

45Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Variance Composition

� Variance of variable X in type A<B<C<X>>>?

� In general, variance of variable X in type C<E>?

� v1 ⊗ v2 = v3. If:

• Variance of variable X in type expression E is v2.

• The def-site variance of class C is v1.

• Then: variance of X in C<E> is v3.

Page 46: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

46Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Variance Composition

� Variance of variable X in type A<B<C<X>>>?

� In general, variance of variable X in type C<E>?

� v1 ⊗ v2 = v3. If:

• Variance of variable X in type expression E is v2.

• The def-site variance of class C is v1.

• Then: variance of X in C<E> is v3.

Page 47: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

47Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Variance Composition

� Variance of variable X in type A<B<C<X>>>?

� In general, variance of variable X in type C<E>?

� v1 ⊗ v2 = v3. If:

• Variance of variable X in type expression E is v2.

• The def-site variance of class C is v1.

• Then: variance of X in C<E> is v3.

Transform Operator

Page 48: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

48Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Deriving Transform Operator

Example Case: + ⊗⊗⊗⊗ – = –

� Class C is covariant.

� Type E is contravariant in X.

� Need to show C<E> is contravariant in X.

� For any T1, T2:

� Hence, C<E> contravariant in X.

Page 49: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

49Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Deriving Transform Operator

Example Case: + ⊗⊗⊗⊗ – = –

� Class C is covariant.

� Type E is contravariant in X.

� Need to show C<E> is contravariant in X.

� For any T1, T2:

� Hence, C<E> contravariant in X.

Page 50: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

50Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Deriving Transform Operator

Example Case: + ⊗⊗⊗⊗ – = –

� Class C is covariant.

� Type E is contravariant in X.

� Need to show C<E> is contravariant in X.

� For any T1, T2:

� Hence, C<E> contravariant in X.

Page 51: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

51Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Deriving Transform Operator

Example Case: + ⊗⊗⊗⊗ – = –

� Class C is covariant.

� Type E is contravariant in X.

� Need to show C<E> is contravariant in X.

� For any T1, T2:

� Hence, C<E> contravariant in X.

Page 52: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

52Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Deriving Transform Operator

Example Case: + ⊗⊗⊗⊗ – = –

� Class C is covariant.

� Type E is contravariant in X.

� Need to show C<E> is contravariant in X.

� For any T1, T2:

� Hence, C<E> contravariant in X.

Page 53: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

53Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Summary of Transform

� Invariance transforms everything into invariance.

� Bivariance transforms everything into bivariance.

� Covariance preserves a variance.

� Contravariance reverses a variance.

Page 54: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

54Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Definition of var predicate

� See paper for further cases.

Page 55: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

55Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Definition of var predicate

� See paper for further cases.

definition-site variance table

Page 56: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

56Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Type Checking Variance

� Definition-site variance annotations are type checked using var predicate and assumed variances of each position.

� Soundness proof verifies variance reasoning is safe.

Page 57: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

57Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

General Theory – Template for Adding Variance

� Variance composition:v1 ⊗ v2 = v3

� Variance binary predicate:v(T; T’)

� Variance lattice:v1 ≤ v2

� Variance of a type:var(X; T)

� Relating variance to subtyping:Subtype Lifting Lemma

� Variance of a position: See paper

Page 58: Java Wildcards Meet Definition-Site Variancejgaltidor.github.io/varj_ecoop12_slides.pdfDefinition-Site Variance (C#/ Scala) Programmer specifies variance in definition as in Scalaand

58Java Wildcards Meet Definition-Site Variance - Altidor, Reichenbach, Smaragdakis

Summary of Contributions

� Generics and subtyping coexist fruitfully.

� Model full complexities of Java wildcards andinteraction with definition-site.

� Generalizes all previous related work.

� Resolve central questions in the design of any language involving parametric polymorphism and subtyping.

• Variance of various types (e.g. existential types).

• Variance of a position (e.g. polymorphic type bounds).

� Paper explains a lot more.