Java Wildcards Meet Definition-Site...
Transcript of Java Wildcards Meet Definition-Site...
![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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/1.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/2.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/3.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/4.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/5.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/6.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/7.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/8.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/9.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/10.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/11.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/12.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/13.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/14.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/15.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/16.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/17.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/18.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/19.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/20.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/21.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/22.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/23.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/24.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/25.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/26.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/27.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/28.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/29.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/30.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/31.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/32.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/33.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/34.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/35.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/36.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/37.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/38.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/39.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/40.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/41.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/42.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/43.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/44.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/45.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/46.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/47.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/48.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/49.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/50.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/51.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/52.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/53.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/54.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/55.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/56.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/57.jpg)
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](https://reader036.fdocuments.us/reader036/viewer/2022071415/6110b08ecc87957d557aca0d/html5/thumbnails/58.jpg)
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.