type inference in the generic type system of java 5pl/talks/type_inference_generics.pdf · type...

68
Introduction Subtyping The Algorithm Conclusion Type inference in the generic type system of Java 5.0 Martin Pl¨ umicke University of Cooperative Education Stuttgart/Horb 12. Januar 2007 Martin Pl¨ umicke Type inference in the generic type system of Java 5.0

Upload: others

Post on 16-Jun-2020

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type inference in the generic type system of Java 5.0

Martin Plumicke

University of Cooperative EducationStuttgart/Horb

12. Januar 2007

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 2: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Overview

IntroductionProblemRelated work

Subtyping

The AlgorithmType unificationType–inference–algorithmPrincipal typeTool demonstration

Conclusion

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 3: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

ProblemRelated work

Problem

Extensions of the Java 5.0 type–systemI parametrized types, type variables, type terms, wildcards

e.g.

Vector<? extends AbstractList<? super Integer>>

Complex typingsI Often it is not obvious, which are the best types for methods and

variables

I Sometimes principal types in Java 5.0 are intersection types, whichare not expressible (contradictive of writing re-usable code)

=⇒ Developing a type–inference–system, which determines principal types

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 4: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

ProblemRelated work

Problem

Extensions of the Java 5.0 type–systemI parametrized types, type variables, type terms, wildcards

e.g.

Vector<? extends AbstractList<? super Integer>>

Complex typingsI Often it is not obvious, which are the best types for methods and

variables

I Sometimes principal types in Java 5.0 are intersection types, whichare not expressible (contradictive of writing re-usable code)

=⇒ Developing a type–inference–system, which determines principal types

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 5: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

ProblemRelated work

Problem

Extensions of the Java 5.0 type–systemI parametrized types, type variables, type terms, wildcards

e.g.

Vector<? extends AbstractList<? super Integer>>

Complex typingsI Often it is not obvious, which are the best types for methods and

variables

I Sometimes principal types in Java 5.0 are intersection types, whichare not expressible (contradictive of writing re-usable code)

=⇒ Developing a type–inference–system, which determines principal types

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 6: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

ProblemRelated work

Example: Multiplication of matrices

class Matrix extends Vector<Vector<Integer>> {Matrix mul(Matrix m) {

Matrix ret = new Matrix();

int i = 0;

while(i <size()) {Vector<Integer> v1 = this.elementAt(i);

Vector<Integer> v2 = new Vector<Integer>();

int j = 0;

while(j < v1.size()) {int erg = 0;

int k = 0;

while(k < v1.size()) {erg = erg + v1.elementAt(k)

* m.elementAt(k).elementAt(j); k++; }v2.addElement(new Integer(erg)); j++; }

ret.addElement(v2); i++; }return ret; }}

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 7: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

ProblemRelated work

Alternative Typing

class Matrix extends Vector<Vector<Integer>> {Matrix/Vector<Vector<Integer>> mul(Matrix/Vector<Vector<Integer>> m) {

Matrix/Vector<Vector<Integer>> ret = new Matrix();

int i = 0;

while(i <size()) {Vector<Integer> v1 = this.elementAt(i);

Vector<Integer> v2 = new Vector<Integer>();

int j = 0;

while(j < v1.size()) {int erg = 0;

int k = 0;

while(k < v1.size()) {erg = erg + v1.elementAt(k)

* m.elementAt(k).elementAt(j); k++; }v2.addElement(new Integer(erg)); j++; }

ret.addElement(v2); i++; }return ret; }}

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 8: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

ProblemRelated work

Purpose: Typless

class Matrix extends Vector<Vector<Integer>> {mul(m) {

ret = new Matrix();

i = 0;

while(i <size()) {v1 = this.elementAt(i);

v2 = new Vector<Integer>();

j = 0;

while(j < v1.size()) {erg = 0;

k = 0;

while(k < v1.size()) {erg = erg + v1.elementAt(k)

* m.elementAt(k).elementAt(j); k++; }v2.addElement(new Integer(erg)); j++; }

ret.addElement(v2); i++; }return ret; }}

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 9: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

ProblemRelated work

System determines the principle typing(s)

mul: Matrix → Matrix &Matrix→ Vector<Vector<Integer>>& . . .&Vector<? extends Vector<? extends Integer>>

→ Vector<? super Vector<Integer>>

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 10: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

ProblemRelated work

Related work

over type expressions)

recursive typeF−bounded polymorphismus

(Cartesian product algorithm

(Data polymorpic Cartesian product algorithm in Java)

type system

S−unification)

[Plevyak, Chien 94]

(Precise concrete TI in OO data polymorphism function polymorphism no principal type)

(inclusion constraints)

[Hindley/Milner et. al.]

[Aiken, Wimmer 93]

[Eifrig, Smith, Trifonov 95a/b][Agesen 95/96]

no data polymorphism) [Agesen, Palsberg, Schwartzbach 93]

[Palsberg, Schwartzbach 91]

(TI in OO−Languages)

(Inheritance)

[Wang, Smith 01]

(Type parameter inference, Generic Libraries

(Type parameter inference, Generic Libraries Extension of [Palsberg, Schwartzbach 94] to parametrized types)

[Fuhrer, Tip Kiezun, Dolby, Keller 05]

[Donovan,Kiezun, Tschantz, Ernst 04]

(copying classes)

diiferentiation of declaration and allocation side

[Oxhoj, Palsberg, Schwartzbach 92]

[Palsberg, Schwartzbach 94]

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 11: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

ProblemRelated work

Related work

over type expressions)

recursive typeF−bounded polymorphismus

(Cartesian product algorithm

(Data polymorpic Cartesian product algorithm in Java)

type system

S−unification)

[Plevyak, Chien 94]

(Precise concrete TI in OO data polymorphism function polymorphism no principal type)

(inclusion constraints)

[Hindley/Milner et. al.]

[Aiken, Wimmer 93]

[Eifrig, Smith, Trifonov 95a/b][Agesen 95/96]

no data polymorphism) [Agesen, Palsberg, Schwartzbach 93]

[Palsberg, Schwartzbach 91]

(TI in OO−Languages)

(Inheritance)

[Wang, Smith 01]

(Type parameter inference, Generic Libraries

(Type parameter inference, Generic Libraries

[Fuhrer, Tip Kiezun, Dolby, Keller 05]

[Donovan,Kiezun, Tschantz, Ernst 04]

(copying classes)

diiferentiation of declaration and allocation side

[Oxhoj, Palsberg, Schwartzbach 92]

[Palsberg, Schwartzbach 94]

precise typesno principle type

Extension of [Palsberg, Schwartzbach 94] to parametrized types)

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 12: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

ProblemRelated work

Related work

recursive type

over type expressions)

F−bounded polymorphismus

(Cartesian product algorithm

(Data polymorpic Cartesian product algorithm in Java)

type system

S−unification)

precise types

(Type parameter inference, Generic Libraries Extension of [Palsberg, Schwartzbach 94] to parametrized types)

[Fuhrer, Tip Kiezun, Dolby, Keller 05]

[Donovan,Kiezun, Tschantz, Ernst 04]

(copying classes)

diiferentiation of declaration and allocation side

[Agesen, Palsberg, Schwartzbach 93]

[Palsberg, Schwartzbach 91]

(Precise concrete TI in OO data polymorphism function polymorphism no principal type)

(inclusion constraints)

(TI in OO−Languages)

(Inheritance)

[Wang, Smith 01]

[Hindley/Milner et. al.]

[Aiken, Wimmer 93]

[Eifrig, Smith, Trifonov 95a/b]

[Plevyak, Chien 94]

no principle type

[Agesen 95/96]

no data polymorphism)

[Oxhoj, Palsberg, Schwartzbach 92]

λ− Terms

[Palsberg, Schwartzbach 94]

(Type parameter inference, Generic Libraries

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 13: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

ProblemRelated work

Our approach

[Hindley/Milner et al]

– function type constructor → (no higher–order functions)

+ function template (ty1 × . . .× tyn) → ty0

(first–order functions)

+ data and function polymorphism (overloading)

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 14: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

ProblemRelated work

Our approach

[Hindley/Milner et al]

– function type constructor → (no higher–order functions)

+ function template (ty1 × . . .× tyn) → ty0

(first–order functions)

+ data and function polymorphism (overloading)

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 15: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

ProblemRelated work

Our approach

[Hindley/Milner et al]

– function type constructor → (no higher–order functions)

+ function template (ty1 × . . .× tyn) → ty0

(first–order functions)

+ data and function polymorphism (overloading)

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 16: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

ProblemRelated work

Abbreviation for wildcard–types

Instead of A<? extends B> we write

A<?B>

and instead of C<? super D> we write

C<?D>.

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 17: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Subtyping ordering ≤∗

Reflexive and transitiv closure of

I if θ extends θ′ then θ≤∗ θ′.I if θ1≤∗ θ2 then σ1( θ1 )≤∗ σ2( θ2 ), where for each type variable a ofθ2 holds σ1( a ) = σ2( a ) (soundness condition).

I a≤∗ θ′ for a ∈ BTV (θ1&...&θn) where ∃θi : θi ≤∗ θ′.I It holds C<θ1, . . . , θn>≤∗ C<θ′1, . . . , θ

′n> if for θi and θ′i either

I θi = ?θi , θ′i = ?θ

′i and θi ≤∗ θ

′i or

I θi = ?θi , θ′i = ?θ

′i and θ

′i ≤∗ θi or

I θi , θ′i are no wildcard arguments and θi = θ′i or

I θ′i = ?θi orI θ′i = ?θi

I It holds C<θ1, . . . , θn>≤∗ C<θ′1, . . . , θ′n> if it holds

C<θ1, . . . , θn>≤∗ C<θ′1, . . . , θ′n> and C<θ1, . . . , θn> is the capture

conversions of C<θ1, . . . , θn>.

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 18: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Capture conversion

The capture conversions C<θ1, . . . , θn> of a type C<θ1, . . . , θn> isdefined as:

I for all θi = ? there is a fresh type variable bi |ui [ai=bi | 16i6n] suchthat θi = bi .

I for all θi = ?θ′i there is a fresh type variable bi |θ

′i & ui [ai=bi | 16i6n],

such that θi = bi .

I for all θi = ?θ′i there is a fresh type variable θ′|bi |ui [ai=bi | 16i6n] ,such that θi = bi .

I otherwise θi = θi

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 19: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Example: Matrix<a>≤∗ Vector<Vector<a>>

Vector<Vector<Integer>>

Matrix<Integer>

|IntegerX

?

|IntegerX

?

?

?

?

Vector< Vector< >>

Matrix< >

Integer

Vector< Vector<Integer>>

Vector< Vector< >>

Matrix< > Integer |IntegerX

X

?

?

|Integer

Vector<Vector<Integer>>

Matrix< >

Vector<Vector< >>

Vector<Vector< >>

Integer

Matrix< > Integer

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 20: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Example: Matrix<a>≤∗ Vector<Vector<a>>

Vector<Vector<Integer>>

Matrix<Integer>

|IntegerX

?

|IntegerX

?

?

?

?

Vector< Vector< >>

Matrix< >

Integer

Vector< Vector<Integer>>

Vector< Vector< >>

Matrix< > Integer |IntegerX

X

?

?

|Integer

Vector<Vector<Integer>>

Matrix< >

Vector<Vector< >>

Vector<Vector< >>

Integer

Matrix< > Integer

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 21: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Example: Matrix<a>≤∗ Vector<Vector<a>>

Vector<Vector<Integer>>

Matrix<Integer>

|IntegerX

?

|IntegerX

?

?

?

?

Vector< Vector< >>

Matrix< >

Integer

Vector< Vector<Integer>>

Vector< Vector< >>

Matrix< > Integer

|IntegerX

X

?

?

|Integer

Vector<Vector<Integer>>

Matrix< >

Vector<Vector< >>

Vector<Vector< >>

Integer

Matrix< > Integer

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 22: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Example: Matrix<a>≤∗ Vector<Vector<a>>

Vector<Vector<Integer>>

Matrix<Integer>

|IntegerX

?

|IntegerX

?

?

?

?

Vector< Vector< >>

Matrix< >

Integer

Vector< Vector<Integer>>

Vector< Vector< >>

Matrix< > Integer |IntegerX

X

?

?

|Integer

Vector<Vector<Integer>>

Matrix< >

Vector<Vector< >>

Vector<Vector< >>

Integer

Matrix< > Integer

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 23: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

The algorithm

Type unification

Subtyping relation for type terms: ≤∗

Type Unification problem:

For two type terms θ1 and θ2 a substitution σ is demandedsuch that:

σ( θ1 )≤∗ σ( θ2 ).

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 24: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Base of Hindley/Milner approach:(Type) unification algorithm [Martelli, Montanari 1982]

(reduce)Eq ∪ {C<θ1, . . . , θn>

.= C<θ′1, . . . , θ

′n> }

Eq ∪ { θ1.= θ′1, . . . , θn

.= θ′n }

(erase)Eq ∪ { θ .

= θ′ }Eq

θ = θ′

(swap)Eq ∪ { θ .

= a }Eq ∪ { a

.= θ } a ∈ TV

(subst)Eq ∪ { a

.= θ }

Eq[a 7→ θ] ∪ { a.= θ } a occurs in Eq but not in θ

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 25: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type unification algorithm for Java 5.0 type terms withoutwildcards [Plumicke 2004, Unif’04, Cork]

(adapt)Eq ∪ {D<θ1, . . . , θn> l D′<θ′1, . . . , θ′m> }Eq ∪ {D′<θ

′1, . . . , θ

′m>[ai 7→ θi | 16 i 6n] l D′<θ′1, . . . , θ′m> }

where there are θ′1, . . . , θ

′m with

I (D<a1, . . . , an>≤∗ D′<θ′1, . . . , θ

′m>) ∈ FC( ≤ )

(reduce1)Eq ∪ {C<θ1, . . . , θn> l D<θ′1, . . . , θ′n> }Eq ∪ { θπ( 1 )

.= θ′1, . . . , θπ( n )

.= θ′n }

where

I C<a1, . . . , an>≤∗ D<aπ( 1 ), . . . , aπ( n )>

I { a1, . . . , an } ⊆ TV

I π is a permutation

(reduce2)Eq ∪ {C<θ1, . . . , θn>

.= C<θ′1, . . . , θ′n> }

Eq ∪ { θ1.= θ′1, . . . , θn

.= θ′n }

(erase)Eq ∪ { θ

.= θ′ }

Eqθ = θ′

(swap)Eq ∪ { θ

.= a }

Eq ∪ { a.= θ } a ∈ TV

(subst)Eq ∪ { a

.= θ }

Eq[a 7→ θ] ∪ { a.= θ }

where

I a occurs in Eqbut not in θ

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 26: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type unification algorithm for Java 5.0 type terms withoutwildcards [Plumicke 2004, Unif’04, Cork]

(adapt)Eq ∪ {D<θ1, . . . , θn> l D′<θ′1, . . . , θ′m> }Eq ∪ {D′<θ

′1, . . . , θ

′m>[ai 7→ θi | 16 i 6n] l D′<θ′1, . . . , θ′m> }

where there are θ′1, . . . , θ

′m with

I (D<a1, . . . , an>≤∗ D′<θ′1, . . . , θ

′m>) ∈ FC( ≤ )

(reduce1)Eq ∪ {C<θ1, . . . , θn> l D<θ′1, . . . , θ′n> }Eq ∪ { θπ( 1 )

.= θ′1, . . . , θπ( n )

.= θ′n }

where

I C<a1, . . . , an>≤∗ D<aπ( 1 ), . . . , aπ( n )>

I { a1, . . . , an } ⊆ TV

I π is a permutation

(reduce2)Eq ∪ {C<θ1, . . . , θn>

.= C<θ′1, . . . , θ′n> }

Eq ∪ { θ1.= θ′1, . . . , θn

.= θ′n }

(erase)Eq ∪ { θ

.= θ′ }

Eqθ = θ′

(swap)Eq ∪ { θ

.= a }

Eq ∪ { a.= θ } a ∈ TV

(subst)Eq ∪ { a

.= θ }

Eq[a 7→ θ] ∪ { a.= θ }

where

I a occurs in Eqbut not in θ

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 27: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type unification algorithm for Java 5.0 type terms withoutwildcards [Plumicke 2004, Unif’04, Cork]

(adapt)Eq ∪ {D<θ1, . . . , θn> l D′<θ′1, . . . , θ′m> }Eq ∪ {D′<θ

′1, . . . , θ

′m>[ai 7→ θi | 16 i 6n] l D′<θ′1, . . . , θ′m> }

where there are θ′1, . . . , θ

′m with

I (D<a1, . . . , an>≤∗ D′<θ′1, . . . , θ

′m>) ∈ FC( ≤ )

(reduce1)Eq ∪ {C<θ1, . . . , θn> l D<θ′1, . . . , θ′n> }Eq ∪ { θπ( 1 )

.= θ′1, . . . , θπ( n )

.= θ′n }

where

I C<a1, . . . , an>≤∗ D<aπ( 1 ), . . . , aπ( n )>

I { a1, . . . , an } ⊆ TV

I π is a permutation

(reduce2)Eq ∪ {C<θ1, . . . , θn>

.= C<θ′1, . . . , θ′n> }

Eq ∪ { θ1.= θ′1, . . . , θn

.= θ′n }

(erase)Eq ∪ { θ

.= θ′ }

Eqθ = θ′

(swap)Eq ∪ { θ

.= a }

Eq ∪ { a.= θ } a ∈ TV

(subst)Eq ∪ { a

.= θ }

Eq[a 7→ θ] ∪ { a.= θ }

where

I a occurs in Eqbut not in θ

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 28: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type unification algorithm with wildcards

(redUp)Eq ∪ { θ l ?θ′ }Eq ∪ { θ l θ′ } (redUpLow)

Eq ∪ { ?θ l ?θ′ }Eq ∪ { θ l θ′ } (redLow)

Eq ∪ { ?θ l θ′ }Eq ∪ { θ l θ′ }

Wildcards in outermost position

(red1)Eq ∪ {C<θ1, . . . , θn> l D<θ′1, . . . , θ

′n> }

Eq ∪ { θπ( 1 ) l? θ′1, . . . , θπ( n ) l? θ

′n }

Reduce rule for outermosttype symbol

where– C<a1, . . . , an>≤∗ D<aπ( 1 ), . . . , aπ( n )>

– { a1, . . . , an } ⊆ BTV

– π is a permutation

(redExt)Eq ∪ {X<θ1, . . . , θn>l? ?Y <θ′1, . . . , θ

′n> }

Eq ∪ { θπ( 1 ) l? θ′1, . . . , θπ( n ) l? θ

′n }

Reduce rule forextends wildcards

where– ?Y <aπ( 1 ), . . . , aπ( n )> ∈ gr(X<a1, . . . , an> )– { a1, . . . , an } ⊆ BTV

– π is a permutation

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 29: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type unification algorithm with wildcards

(redUp)Eq ∪ { θ l ?θ′ }Eq ∪ { θ l θ′ } (redUpLow)

Eq ∪ { ?θ l ?θ′ }Eq ∪ { θ l θ′ } (redLow)

Eq ∪ { ?θ l θ′ }Eq ∪ { θ l θ′ }

Wildcards in outermost position

(red1)Eq ∪ {C<θ1, . . . , θn> l D<θ′1, . . . , θ

′n> }

Eq ∪ { θπ( 1 ) l? θ′1, . . . , θπ( n ) l? θ

′n }

Reduce rule for outermosttype symbol

where– C<a1, . . . , an>≤∗ D<aπ( 1 ), . . . , aπ( n )>

– { a1, . . . , an } ⊆ BTV

– π is a permutation

(redExt)Eq ∪ {X<θ1, . . . , θn>l? ?Y <θ′1, . . . , θ

′n> }

Eq ∪ { θπ( 1 ) l? θ′1, . . . , θπ( n ) l? θ

′n }

Reduce rule forextends wildcards

where– ?Y <aπ( 1 ), . . . , aπ( n )> ∈ gr(X<a1, . . . , an> )– { a1, . . . , an } ⊆ BTV

– π is a permutation

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 30: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type unification algorithm with wildcards

(redUp)Eq ∪ { θ l ?θ′ }Eq ∪ { θ l θ′ } (redUpLow)

Eq ∪ { ?θ l ?θ′ }Eq ∪ { θ l θ′ } (redLow)

Eq ∪ { ?θ l θ′ }Eq ∪ { θ l θ′ }

Wildcards in outermost position

(red1)Eq ∪ {C<θ1, . . . , θn> l D<θ′1, . . . , θ

′n> }

Eq ∪ { θπ( 1 ) l? θ′1, . . . , θπ( n ) l? θ

′n }

Reduce rule for outermosttype symbol

where– C<a1, . . . , an>≤∗ D<aπ( 1 ), . . . , aπ( n )>

– { a1, . . . , an } ⊆ BTV

– π is a permutation

(redExt)Eq ∪ {X<θ1, . . . , θn>l? ?Y <θ′1, . . . , θ

′n> }

Eq ∪ { θπ( 1 ) l? θ′1, . . . , θπ( n ) l? θ

′n }

Reduce rule forextends wildcards

where– ?Y <aπ( 1 ), . . . , aπ( n )> ∈ gr(X<a1, . . . , an> )– { a1, . . . , an } ⊆ BTV

– π is a permutation

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 31: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type unification algorithm with wildcards

(redSup)Eq ∪ {X<θ1, . . . , θn>l?

?Y <θ′1, . . . , θ′n> }

Eq ∪ { θ′1 l? θπ( 1 ), . . . , θ′n l? θπ( n ) }

Reduce rule forsuper wildcards

where

– ?Y <aπ( 1 ), . . . , aπ( n )> ∈ gr(X<a1, . . . , an> )– { a1, . . . , an } ⊆ BTV

– π is a permutation

(redEq)Eq ∪ {X<θ1, . . . , θn>l? X<θ′1, . . . , θ

′n> }

Eq ∪ { θπ( 1 ).= θ′1, . . . , θπ( n )

.= θ′n }

Reduce rule forequal type symbols

(reduce2)Eq ∪ {C<θ1, . . . , θn>

.= C<θ′1, . . . , θ

′n> }

Eq ∪ { θ1.= θ′1, . . . , θn

.= θ′n }

Original reduce rule

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 32: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type unification algorithm with wildcards

(redSup)Eq ∪ {X<θ1, . . . , θn>l?

?Y <θ′1, . . . , θ′n> }

Eq ∪ { θ′1 l? θπ( 1 ), . . . , θ′n l? θπ( n ) }

Reduce rule forsuper wildcards

where

– ?Y <aπ( 1 ), . . . , aπ( n )> ∈ gr(X<a1, . . . , an> )– { a1, . . . , an } ⊆ BTV

– π is a permutation

(redEq)Eq ∪ {X<θ1, . . . , θn>l? X<θ′1, . . . , θ

′n> }

Eq ∪ { θπ( 1 ).= θ′1, . . . , θπ( n )

.= θ′n }

Reduce rule forequal type symbols

(reduce2)Eq ∪ {C<θ1, . . . , θn>

.= C<θ′1, . . . , θ

′n> }

Eq ∪ { θ1.= θ′1, . . . , θn

.= θ′n }

Original reduce rule

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 33: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type unification algorithm with wildcards

(redSup)Eq ∪ {X<θ1, . . . , θn>l?

?Y <θ′1, . . . , θ′n> }

Eq ∪ { θ′1 l? θπ( 1 ), . . . , θ′n l? θπ( n ) }

Reduce rule forsuper wildcards

where

– ?Y <aπ( 1 ), . . . , aπ( n )> ∈ gr(X<a1, . . . , an> )– { a1, . . . , an } ⊆ BTV

– π is a permutation

(redEq)Eq ∪ {X<θ1, . . . , θn>l? X<θ′1, . . . , θ

′n> }

Eq ∪ { θπ( 1 ).= θ′1, . . . , θπ( n )

.= θ′n }

Reduce rule forequal type symbols

(reduce2)Eq ∪ {C<θ1, . . . , θn>

.= C<θ′1, . . . , θ

′n> }

Eq ∪ { θ1.= θ′1, . . . , θn

.= θ′n }

Original reduce rule

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 34: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type unification algorithm with wildcards

(adapt)Eq ∪ {D<θ1, . . . , θn> l D ′<θ′1, . . . , θ

′m> }

Eq ∪ {D ′<θ′1, . . . , θ

′m>[ai 7→ CC( θi ) | 16 i 6n] l D ′<θ′1, . . . , θ

′m> }

where there are θ′1, . . . , θ

′m with outermost adapt rule

I (D<a1, . . . , an>≤∗ D ′<θ′1, . . . , θ

′m>) ∈ FC( ≤ )

(adaptExt)Eq ∪ {D<θ1, . . . , θn>l? ?D

′<θ′1, . . . , θ′m> }

Eq ∪ {D ′<θ′1, . . . , θ

′m>[ai 7→ CC( θi ) | 16 i 6n] l? ?D

′<θ′1, . . . , θ′m> }

where there are θ′1, . . . , θ

′m with adapt rule: extends wildcard

I (D<a1, . . . , an>≤∗ D ′<θ′1, . . . , θ

′m>) ∈ FC( ≤ )

(adaptSup)Eq ∪ {D ′<θ′1, . . . , θ

′m>l?

?D<θ1, . . . , θn> }Eq ∪ {D ′<θ

′1, . . . , θ

′m>[ai 7→ CC( θi ) | 16 i 6n] l? ?D

′<θ′1, . . . , θ′m> }

where there are θ′1, . . . , θ

′m with adapt rule: super wildcard

I (D<a1, . . . , an>≤∗ D ′<θ′1, . . . , θ

′m>) ∈ FC( ≤ )

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 35: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type unification algorithm with wildcards

(adapt)Eq ∪ {D<θ1, . . . , θn> l D ′<θ′1, . . . , θ

′m> }

Eq ∪ {D ′<θ′1, . . . , θ

′m>[ai 7→ CC( θi ) | 16 i 6n] l D ′<θ′1, . . . , θ

′m> }

where there are θ′1, . . . , θ

′m with outermost adapt rule

I (D<a1, . . . , an>≤∗ D ′<θ′1, . . . , θ

′m>) ∈ FC( ≤ )

(adaptExt)Eq ∪ {D<θ1, . . . , θn>l? ?D

′<θ′1, . . . , θ′m> }

Eq ∪ {D ′<θ′1, . . . , θ

′m>[ai 7→ CC( θi ) | 16 i 6n] l? ?D

′<θ′1, . . . , θ′m> }

where there are θ′1, . . . , θ

′m with adapt rule: extends wildcard

I (D<a1, . . . , an>≤∗ D ′<θ′1, . . . , θ

′m>) ∈ FC( ≤ )

(adaptSup)Eq ∪ {D ′<θ′1, . . . , θ

′m>l?

?D<θ1, . . . , θn> }Eq ∪ {D ′<θ

′1, . . . , θ

′m>[ai 7→ CC( θi ) | 16 i 6n] l? ?D

′<θ′1, . . . , θ′m> }

where there are θ′1, . . . , θ

′m with adapt rule: super wildcard

I (D<a1, . . . , an>≤∗ D ′<θ′1, . . . , θ

′m>) ∈ FC( ≤ )

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 36: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type unification algorithm with wildcards

(adapt)Eq ∪ {D<θ1, . . . , θn> l D ′<θ′1, . . . , θ

′m> }

Eq ∪ {D ′<θ′1, . . . , θ

′m>[ai 7→ CC( θi ) | 16 i 6n] l D ′<θ′1, . . . , θ

′m> }

where there are θ′1, . . . , θ

′m with outermost adapt rule

I (D<a1, . . . , an>≤∗ D ′<θ′1, . . . , θ

′m>) ∈ FC( ≤ )

(adaptExt)Eq ∪ {D<θ1, . . . , θn>l? ?D

′<θ′1, . . . , θ′m> }

Eq ∪ {D ′<θ′1, . . . , θ

′m>[ai 7→ CC( θi ) | 16 i 6n] l? ?D

′<θ′1, . . . , θ′m> }

where there are θ′1, . . . , θ

′m with adapt rule: extends wildcard

I (D<a1, . . . , an>≤∗ D ′<θ′1, . . . , θ

′m>) ∈ FC( ≤ )

(adaptSup)Eq ∪ {D ′<θ′1, . . . , θ

′m>l?

?D<θ1, . . . , θn> }Eq ∪ {D ′<θ

′1, . . . , θ

′m>[ai 7→ CC( θi ) | 16 i 6n] l? ?D

′<θ′1, . . . , θ′m> }

where there are θ′1, . . . , θ

′m with adapt rule: super wildcard

I (D<a1, . . . , an>≤∗ D ′<θ′1, . . . , θ

′m>) ∈ FC( ≤ )

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 37: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type unification algorithm with wildcards

(erase1)Eq ∪ { θ l θ′ }Eq

θ≤∗ θ′

(erase2)Eq ∪ { θl? θ

′ }Eq

θ′ ∈ gr( θ )

(erase3)Eq ∪ { θ .

= θ′ }Eq

θ = θ′

(swap)Eq ∪ { θ .

= a }Eq ∪ { a

.= θ } θ 6∈ BTV , a ∈ BTV

(subst)Eq′ ∪ { a

.= θ }

Eq′[a 7→ θ] ∪ { a.= θ } a occurs in Eq′ but not in θ

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 38: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type unification algorithm with wildcards

(erase1)Eq ∪ { θ l θ′ }Eq

θ≤∗ θ′

(erase2)Eq ∪ { θl? θ

′ }Eq

θ′ ∈ gr( θ )

(erase3)Eq ∪ { θ .

= θ′ }Eq

θ = θ′

(swap)Eq ∪ { θ .

= a }Eq ∪ { a

.= θ } θ 6∈ BTV , a ∈ BTV

(subst)Eq′ ∪ { a

.= θ }

Eq′[a 7→ θ] ∪ { a.= θ } a occurs in Eq′ but not in θ

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 39: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Example

Subtyping relation: Matrix<a>≤∗ Vector<Vector<a>>Vector<a>≤∗ AbstractList<a>≤∗ List<a>

Application of the algorithm:{ Matrix<b> l Vector<Vector<?AbstractList<Object>>>, a

.= b }

(adapt)=⇒ { Vector<Vector<CC( b )>>

lVector<Vector<?AbstractList<Object>>>,a.= b }

(red1,redEq)=⇒ {CC( b )

.= ?AbstractList<Object>,

a.= b }

=⇒ fail

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 40: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Example cont.

{ Matrix<b> l Vector<?Vector<?AbstractList<Object>>>,a.= b }

adapt=⇒ { Vector<Vector<CC( b )>>

lVector<?Vector<?AbstractList<Object>>>,a.= b }

red1,redExt=⇒ {CC( b ) l? ?AbstractList<Object>,

a.= b }

newsets,subst=⇒ {{ b .

= AbstractList<Object>, a.= AbstractList<Object> },

{ b .= ?AbstractList<Object>, a

.= ?AbstractList<Object> },

{ b .= Vector<Object>, a

.= Vector<Object> },

{ b .= ?Vector<Object>, a

.= ?Vector<Object> } }

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 41: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type–inference–algorithm

Type assumptions: For each absent type in the program atype-placeholder (fresh type variable) is assumed.

Run over the abstract syntax tree: During the run over abstract syntaxtree of the coresponding java class the types are calculatedgradually by type unification.

Multiplying the assumptions: If the result of a type unification containsmore than one result or if there is data polymorphism, the set oftype assumptions is multiplied.

Erase type assumptions: If the type unification fails, the correspondingset of type assumptions is erased.

New method type parameters: At the end remained type-placeholdersare replaced by new introduced method type parameters.

Intersection types: At the end each remained set of type assumptionsforms one element of the result’s intersection type.

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 42: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type–inference rules

(O, τ, τ ′) BExpr e1 : θ′, (O, τ, τ ′) BExpr e2 : θ[Assign]

(O, τ, τ ′) BExpr Assign( e1, e2 ) : θ′θ≤∗ θ′

(O, τ, τ ′) BExpr re : θ∀16 i 6n : (O, τ, τ ′) BExpr ei : θi ,

(θ′1 . . . θ′n, θ) = lub( θ, f , (θ1, . . . , θn) )

[Method-Call

](O, τ, τ ′) BExpr MethodCall( re, f ( e1, . . . , en ) ) : θ

(O, τ, τ ′) BExpr e : θ[Return]

(O, τ, τ ′) BStmt Return( e ) : θ

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 43: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type–inference rules

(O, τ, τ ′) BExpr e1 : θ′, (O, τ, τ ′) BExpr e2 : θ[Assign]

(O, τ, τ ′) BExpr Assign( e1, e2 ) : θ′θ≤∗ θ′

(O, τ, τ ′) BExpr re : θ∀16 i 6n : (O, τ, τ ′) BExpr ei : θi ,

(θ′1 . . . θ′n, θ) = lub( θ, f , (θ1, . . . , θn) )

[Method-Call

](O, τ, τ ′) BExpr MethodCall( re, f ( e1, . . . , en ) ) : θ

(O, τ, τ ′) BExpr e : θ[Return]

(O, τ, τ ′) BStmt Return( e ) : θ

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 44: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type–inference rules

(O, τ, τ ′) BExpr e1 : θ′, (O, τ, τ ′) BExpr e2 : θ[Assign]

(O, τ, τ ′) BExpr Assign( e1, e2 ) : θ′θ≤∗ θ′

(O, τ, τ ′) BExpr re : θ∀16 i 6n : (O, τ, τ ′) BExpr ei : θi ,

(θ′1 . . . θ′n, θ) = lub( θ, f , (θ1, . . . , θn) )

[Method-Call

](O, τ, τ ′) BExpr MethodCall( re, f ( e1, . . . , en ) ) : θ

(O, τ, τ ′) BExpr e : θ[Return]

(O, τ, τ ′) BStmt Return( e ) : θ

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 45: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Example: Multiplication of matrices: Type assumptions

class Matrix extends Vector<Vector<Integer>> {{α } mul({β } m) {

{ γ } ret = new Matrix();

int i = 0;

while(i <size()) {{ ι } v1 = this.elementAt(i);

{κ } v2 = new Vector<Integer>();

int j = 0;

while(j < v1.size()) {{χ } erg = 0;

int k = 0;

while(k < v1.size()) {erg = erg + ({ ξ }({ ι } v1).elementAt(k))

* ({ψ }({φ } ({β } m).elementAt(k)).elementAt(j)); k++;}v2.addElement({χ } erg); j++; }

ret.addElement({µ } v2); i++; }return ret; }}

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 46: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

ret = new Matrix ()

{α } mul({β } m) {{ γ } ret = { Matrix } new Matrix();. . .return { γ } ret;

}

Unification: Matrix l γ

⇒γ = Matrixγ = Vector<Vector<Integer>>γ = Vector<?Vector<Integer>>γ = Vector<?Vector<?Integer>>γ = Vector<?Vector<

?Integer>>γ = Vector<?Vector<Integer>>

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 47: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Type assumptions after the first unification

class Matrix extends Vector<Vector<Integer>> {{α, α, α, α, α, α } mul({β, β, β, β, β, β } m) {

{ Matrix, Vector<Vector<Integer>>, Vector<?Vector<Integer>>,Vector<?Vector<?Integer>>, Vector<?Vector<

?Integer>>,Vector<?Vector<Integer>> } ret = new Matrix();

int i = 0; while(i <size()) {{ ι, ι, ι, ι, ι, ι } v1 = this.elementAt(i);

{κ, κ, κ, κ, κ, κ } v2 = new Vector<Integer>();

int j = 0; while(j < v1.size()) {{χ, χ, χ, χ, χ, χ } erg = 0;

int k = 0; while(k < v1.size()) {erg = erg +({ ξ, ξ, ξ, ξ, ξ, ξ }({ ι, ι, ι, ι, ι, ι } v1).elementAt(k))

* ({ψ,ψ, ψ, ψ, ψ, ψ }({φ, φ, φ, φ, φ, φ }({β, β, β, β, β, β } m).elementAt(k)).elementAt(j)); k++;}

v2.addElement({χ, χ, χ, χ, χ, χ } erg); j++; }ret.addElement({µ, µ, µ, µ, µ, µ } v2); i++; }

return ret; }}Martin Plumicke Type inference in the generic type system of Java 5.0

Page 48: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

v1 = this.elementAt(i);

{α } mul({β } m) {. . .{ ι } v1 = ({ Matrix } this).elementAt(i);. . .

}

Unification: Matrix l Vector<ι>

ι = Vector<Integer>ι = Vector<?Integer>ι = Vector<?Integer>

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 49: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

v2 = new Vector<Integer> ();

{α } mul({β } m) {. . .{κ } v2 = { Vector<Integer> } new Vector<Integer>();. . .

}

Unification: Vector<Integer> l κ

κ = Vector<Integer>κ = Vector<?Integer>κ = Vector<?Integer>

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 50: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

erg = erg + v1.elementAt(k)

* m.elementAt(k)).elementAt(j)); (I)

{α } mul({β } m) {. . .

{χ } erg = {χ } erg + ({ ξ }({ ι }v1).elementAt(k))* ({ψ }({φ } ({β } m).elementAt(k)).elementAt(j)); k++;}

. . .}

({β } m).elementAt(k): Unification: β l Vector<φ>β = Vector<φ>β = Matrix ⇒ φ = Vector<Integer> or

φ = ?Vector<Integer> orφ = ?Vector<?Integer> orφ = ?Vector<Integer>

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 51: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

erg = erg + v1.elementAt(k)

* m.elementAt(k)).elementAt(j)); (II)

({φ }({β }m).elementAt(k)).elementAt(j):

Unification: φl Vector<ψ>

β = Vector<φ> ⇒ φ = Vector<ψ> orφ = ?Vector<ψ> orφ = Matrix

β = Matrix⇒ φ = Vector<Integer>⇒ OKφ = . . .

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 52: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

erg = erg + v1.elementAt(k)

* m.elementAt(k)).elementAt(j)); (III)

({ ξ }({ ι }v1).elementAt(k))*({ψ }({φ }({β }m).elementAt(k)).elementAt(j)):β = Vector<φ> :

From * : (int, int) → int follows

Unification: ψ l Integer

φ = Vector<ψ> ⇒ ψ = Integer⇒ OK⇒ ψ = ?Integer⇒ OK

φ = ?Vector<ψ> ⇒ ψ = Integer⇒ OK⇒ ψ = ?Integer⇒ OK

φ = Matrix⇒ (ψ =)Vector<Integer> l Integer⇒ fail⇒ assumption is erased

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 53: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

erg = erg + v1.elementAt(k)

* m.elementAt(k)).elementAt(j)); (IV)

{α } mul({β } m) {. . .

}

Result for β:

β = Vector<Vector<Integer>>β = Vector<Vector<?Integer>>β = Vector<?Vector<Integer>>β = Vector<?Vector<?Integer>>β = Matrix

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 54: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

erg = erg + v1.elementAt(k)

* m.elementAt(k)).elementAt(j)); (V)

{χ } erg = {χ } erg + ({ ξ }({ ι }v1).elementAt(k))*({ψ }({φ }({β }m).elementAt(k)).elementAt(j)):

From +, * : (int, int) → intwith

ξ = Integer l Integerξ = ?Integer l Integer

andψ = Integer l Integerψ = ?Integer l Integer

followsχ = Integer

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 55: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

v2.addElement(erg);

{α } mul({β } m) {. . .{κ } v2 = new Vector<Integer>();. . .v2.addElement({χ } erg);. . .

}

χ = Integer, κ = Vector<Integer>⇒ Integer l Integer⇒ OK

χ = Integer, κ = Vector<?Integer>⇒ Integer l ?Integer⇒ fail⇒ assumption is erased

χ = Integer, κ = Vector<?Integer>⇒ Integer l ?Integer⇒ OK

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 56: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

ret.addElement(v2); (I)

{ γ } ret = new Matrix(); . . . ; ret.addElement({κ } v2);

κ = Vector<Integer>, γ = Matrix⇒ Vector<Integer> l Vector<Integer>⇒ OK

κ = Vector<Integer>, γ = Vector<Vector<Integer>>⇒ Vector<Integer> l Vector<Integer>⇒ OK

κ = Vector<Integer>, γ = Vector<?Vector<Integer>>⇒ Vector<Integer> l ?Vector<Integer>⇒ fail

κ = Vector<Integer>, γ = Vector<?Vector<?Integer>>⇒ Vector<Integer> l ?Vector<?Integer>⇒ fail

κ = Vector<Integer>, γ = Vector<?Vector<?Integer>>

⇒ Vector<Integer> l ?Vector<?Integer>⇒ fail

κ = Vector<Integer>, γ = Vector<?Vector<Integer>>⇒ Vector<Integer> l ?Vector<Integer>⇒ OK

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 57: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

ret.addElement(v2); (II)

{ γ } ret = new Matrix(); . . . ; ret.addElement({κ } v2);

With κ = Vector<?Integer> for all assumptions of γ type unificationfails.

Result:γ = Matrixγ = Vector<Vector<Integer>>γ = Vector<?Vector<Integer>>

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 58: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

return ret;

{α } mul({β } m) {. . .return { γ } ret;

}Unification: γ l α forγ = Matrixγ = Vector<Vector<Integer>>γ = Vector<?Vector<Integer>>

Result: α = Matrixα = Vector<Vector<Integer>>α = Vector<?Vector<Integer>>α = Vector<?Vector<Integer>>α = Vector<?Vector<?Integer>>α = Vector<?Vector<

?Integer>>Martin Plumicke Type inference in the generic type system of Java 5.0

Page 59: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Result:

mul: &α,β(α→β),

where

α≤∗ Vector<?Vector<?Integer>>,Matrix≤∗ β

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 60: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Principal type

Definition [Damas, Milner 1982]:

“A type-scheme for a declaration is a principal type-scheme, if any othertype-scheme for the declaration is a generic instance of it.”

Generalization to the Java 5.0 type system

“An intersection type-scheme for a declaration is a principal type-scheme,if any other type-scheme for the declaration is a generic instance of oneelement of the intersection type-scheme.”

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 61: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Principal type

Definition [Damas, Milner 1982]:

“A type-scheme for a declaration is a principal type-scheme, if any othertype-scheme for the declaration is a generic instance of it.”

Generalization to the Java 5.0 type system

“An intersection type-scheme for a declaration is a principal type-scheme,if any other type-scheme for the declaration is a generic instance of oneelement of the intersection type-scheme.”

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 62: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Principal type

DefinitionAn intersection type of a method m in a class C

m : (θ1,1 × . . .× θ1,n → θ1)& . . .&(θm,1 × . . .× θm,n,→ θm)

is called principal if for any correct type annotated method declaration

rty m(ty1 a1 , . . . , tyn an) { . . . }

there is an element (θi ,1 × . . .× θi ,n,→ θi ) of the intersection type andthere is a substitution σ, such that

σ( θi )≤∗ rty , ty1 ≤∗ σ( θi ,1 ), . . . , tyn ≤∗ σ( θi ,n )Martin Plumicke Type inference in the generic type system of Java 5.0

Page 63: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Reduced principal type:

The inferred type of the example

mul: &α,β(α→β),

where α≤∗ Vector<?Vector<?Integer>> and Matrix≤∗ β.

is a principle type.

But there is also a reduced principle type:

mul: Vector<?Vector<?Integer>>→ Matrix

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 64: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Reduced principal type:

The inferred type of the example

mul: &α,β(α→β),

where α≤∗ Vector<?Vector<?Integer>> and Matrix≤∗ β.

is a principle type.

But there is also a reduced principle type:

mul: Vector<?Vector<?Integer>>→ Matrix

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 65: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Principle type property

TheoremThe type inference algorithm calculates a principle type.

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 66: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Type unificationType–inference–algorithmPrincipal typeTool demonstration

Tool demonstration

I Matrix–Example

I Overloading–Example

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 67: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Conclusion and future work

ConclusionI Type-inference-algorithm for Java 5.0

I Type unification

I Principle type property

Future workI Reduce the number of calculated typings.

I Handling of interesection types (adaption of byte-code generation)

Martin Plumicke Type inference in the generic type system of Java 5.0

Page 68: Type inference in the generic type system of Java 5pl/talks/Type_Inference_Generics.pdf · Type inference in the generic type system of Java 5.0 Martin Pl¨umicke University of Cooperative

IntroductionSubtyping

The AlgorithmConclusion

Conclusion and future work

ConclusionI Type-inference-algorithm for Java 5.0

I Type unification

I Principle type property

Future workI Reduce the number of calculated typings.

I Handling of interesection types (adaption of byte-code generation)

Martin Plumicke Type inference in the generic type system of Java 5.0