2023-12-31 02:32:26 +00:00
\section { Syntax}
$
\begin { array} { lrcl}
\hline
\text { Parameterized classes} & \mv N & ::= & \exptype { C} { \ol { W} } \\
\text { Types} & \type { S} , \type { T} , \type { U} & ::= & \type { X} \mid \wcNtype { \Delta } { N} \\
\text { Lower bounds} & \type { K} , \type { L} & ::= & \type { T} \mid \bot \\
\text { Type variable contexts} & \Delta & ::= & \overline { \wildcard { X} { T} { L} } \\
\text { Class declarations} & D & ::= & \texttt { class} \ \exptype { C} { \ol { X \triangleleft T} } \triangleleft \type { N} \set { \overline { \type { T} \ f} ; \ol { M} } \\
\text { Method declarations} & \texttt { M} & ::= & \generics { \ol { X \triangleleft T} } \type { T} \ \texttt { m} (\overline { \type { T} \ x} ) = t \\
\text { Terms} & t & ::= & x \\
& & \ \ | & \texttt { new} \ \exptype { C} { \ol { T} } (\overline { t} )\\
& & \ \ | & t.f\\
& & \ \ | & t.\generics { \ol { T} } \texttt { m} (\overline { t} )\\
& & \ \ | & t \elvis { } t\\
\text { Variable contexts} & \Gamma & ::= & \overline { x:\type { T} } \\
\hline
\end { array}
$
Each class type has a set of wildcard types $ \overline { \Delta } $ attached to it.
The type $ \wctype { \overline { \Delta } } { C } { \ol { T } } $ defines a set of wildcards $ \overline { \Delta } $ ,
which can be used inside the type parameters $ \ol { T } $ .
It is important that each wildcard declaration $ \wildcard { X } { T } { L } $ is unique.
\section { Type rules}
\begin { figure} [tp]
$ \begin { array } { l }
\typerule { S-Refl} \\
\begin { array} { @{ } c}
\Delta \vdash \type { T} <: \type { T}
\end { array}
\end { array} $
$ \begin { array } { l }
\typerule { S-Trans} \\
\begin { array} { @{ } c}
\Delta \vdash \type { S} <: \type { T} ' \quad \quad
\Delta \vdash \type { T} ' <: \type { T}
\\
\hline
\vspace * { -0.3cm} \\
\Delta \vdash \type { S} <: \type { T}
\end { array}
\end { array} $
$ \begin { array } { l }
\typerule { S-Upper} \\
\begin { array} { @{ } c}
\wildcard { X} { U} { L} \in \Delta \\
\vspace * { -0.9em} \\
\hline
\vspace * { -0.9em} \\
\Delta \vdash \type { X} <: \type { U}
\end { array}
\end { array} $
$ \begin { array } { l }
\typerule { S-Lower} \\
\begin { array} { @{ } c}
\wildcard { X} { U} { L} \in \Delta \\
\vspace * { -0.9em} \\
\hline
\vspace * { -0.9em} \\
\Delta \vdash \type { L} <: \type { X}
\end { array}
\end { array} $
\\ [1em]
$ \begin { array } { l }
\typerule { S-Extends} \\
\begin { array} { @{ } c}
\texttt { class} \ \exptype { C} { \overline { \type { X} \triangleleft \type { U} } } \triangleleft \exptype { D} { \ol { S} } \ \{ \ldots \} \\
\ol { X} \cap \text { dom} (\Delta ) = \emptyset
\\
\hline
\vspace * { -0.3cm} \\
\Delta \vdash \wctype { \Delta '} { C} { \ol { T} } <: \wctype { \Delta '} { D} { [\ol { T} /\ol { X} ]\ol { S} }
\end { array}
\end { array} $
$ \begin { array } { l }
\typerule { S-Exists} \\
\begin { array} { @{ } c}
\Delta ', \Delta \vdash [\ol { T} /\ol { \type { X} } ]\ol { L} <: \ol { T} \quad \quad
\Delta ', \Delta \vdash \ol { T} <: [\ol { T} /\ol { \type { X} } ]\ol { U} \\
\text { fv} (\ol { T} ) \subseteq \text { dom} (\Delta , \Delta ') \quad \quad
\text { dom} (\Delta ') \cap \text { fv} (\wctype { \ol { \wildcard { X} { U} { L} } } { C} { \ol { S} } ) = \emptyset
\\
\hline
\vspace * { -0.3cm} \\
\Delta \vdash \wctype { \Delta '} { C} { [\ol { T} /\ol { \type { X} } ]\ol { S} } <:
\wctype { \ol { \wildcard { X} { U} { L} } } { C} { \ol { S} }
\end { array}
\end { array} $
\caption { Subtyping} \label { fig:subtyping}
\end { figure}
\begin { figure} [tp]
2024-01-29 17:39:18 +00:00
\begin { center}
2023-12-31 02:32:26 +00:00
$ \begin { array } { l }
\typerule { WF-Bot} \\
\begin { array} { @{ } c}
\Delta \vdash \bot \ \ok
\end { array}
\end { array} $
$ \begin { array } { l }
\typerule { WF-Top} \\
\begin { array} { @{ } c}
\Delta \vdash \ol { L} , \ol { U} \ \ok
\\
\hline
\vspace * { -0.3cm} \\
\Delta \vdash \overline { \wildcard { W} { U} { L} } .\texttt { Object}
\end { array}
\end { array} $
$ \begin { array } { l }
\typerule { WF-Var} \\
\begin { array} { @{ } c}
2024-01-29 17:39:18 +00:00
\wildcard { W} { U} { L} \in \Delta \quad \quad
2023-12-31 02:32:26 +00:00
\Delta \vdash \ol { L} , \ol { U} \ \ok
\\
\hline
\vspace * { -0.3cm} \\
\Delta \vdash \wildcard { W} { U} { L} \ \ok
\end { array}
\end { array} $
2024-01-29 17:39:18 +00:00
\\ [1em]
2023-12-31 02:32:26 +00:00
$ \begin { array } { l }
\typerule { WF-Class} \\
\begin { array} { @{ } c}
2024-01-29 17:39:18 +00:00
\Delta ' = \ol { \wildcard { W} { U} { L} } \quad \quad
\Delta , \Delta ' \vdash \ol { T} , \ol { L} , \ol { U} \ \ok \quad \quad
\Delta , \Delta ' \vdash \ol { L} <: \ol { U} \\
\Delta , \Delta ' \vdash \ol { T} <: [\ol { T} /\ol { X} ] \ol { U'} \quad \quad
2023-12-31 02:32:26 +00:00
\texttt { class} \ \exptype { C} { \ol { X \triangleleft U'} } \triangleleft \type { N} \ \{ \ldots \}
\\
\hline
\vspace * { -0.3cm} \\
\Delta \vdash \wctype { \ol { \wildcard { W} { U} { L} } } { C} { \ol { T} } \ \ok
\end { array}
\end { array} $
2024-01-29 17:39:18 +00:00
\end { center}
2023-12-31 02:32:26 +00:00
\caption { Well-formedness} \label { fig:well-formedness}
\end { figure}
%TODO: Proof that well-formed (ok) implies that a type is witnessed
We change the type rules to require the well-formedness instead of the witnessed property.
See figure \ref { fig:well-formedness} .
2024-01-04 00:33:36 +00:00
Our well-formedness criteria is more restrictive than the ones used for \wildFJ { } .
\cite { WildcardsNeedWitnessProtection} works with the two different judgements $ \ok $ and \texttt { witnessed} .
With \texttt { witnessed} being the stronger one.
We rephrased the $ \ok $ judgement to include \texttt { witnessed} aswell.
2024-01-05 08:19:10 +00:00
$ \type { T } \ \ok $ in this paper means $ \type { T } \ \ok $ and $ \type { T } \ \texttt { witnessed } $ in the sense of the \wildFJ { } type rules.
2024-01-04 00:33:36 +00:00
Java's type system is complex enough as it is. Simplification, when possible, is always appreciated.
Our $ \ok $ rule may not be able to express every corner of the Java type system, but is sufficient to show soundness regarding type inference for a Java core calculus.
The \rulename { WF-Class} rule requires upper and lower bounds to be direct subtypes of each other $ \type { L } <: \type { U } $ .
The type rules from \cite { WildcardsNeedWitnessProtection} use a witness type instead.
Stating that a type is well formed (\texttt { witnessed} ) if there exists atleast one simple type $ \type { N } $ as a possible subtype:
$ \Delta \vdash \type { N } <: \wctype { \Delta ' } { C } { \ol { T } } $ .
2024-01-05 08:19:10 +00:00
A witness type is easy to find by replacing every wildcard $ \ol { W } $ in $ \wctype { \ol { \wildcard { W } { U } { L } } } { C } { \ol { T } } $ by its upper bound:
$ \Delta \vdash \exptype { C } { [ \ol { U } / \ol { W } ] \ol { T } } <: \wctype { \ol { \wildcard { W } { U } { L } } } { C } { \ol { T } } $ .
$ \Delta \vdash \exptype { C } { [ \ol { U } / \ol { W } ] \ol { T } } \ \texttt { witnessed } $ is given due to $ \Delta \vdash \ol { T } , \ol { L } , \ol { U } \ \ok $
and $ \Delta \vdash \wctype { \ol { \wildcard { W } { U } { L } } } { C } { \ol { T } } \ \ok $ .
2024-01-04 00:33:36 +00:00
2024-01-05 08:19:10 +00:00
%Not necessary!
% Additionally we do not allow nested wildcards. %TODO: Unify cannot create them (or does it?) What is when the input contains them
% The \unify{} algorithm is not capable of generating types like $\wctype{\rwildcard{X}, \wildcard{Y}{\bot}{\rwildcard{X}}}{Pair}{\rwildcard{X}, \rwildcard{Y}}$.
% %But they could be created in intermidiate types (\ol{S}) in method calls by capture conversion:
% class WList<A> extends List<List<? extends A>>
% m(List<X> l) % TODO
% m(X.Wlist<X>) % S = Y^X.List<Y>
% X.WList<X> <. List<x?>
% X.List<Y^X.List<Y>> <. List<x?>
% x =. Y^X.List<Y>
% %TODO: do we need \Delta' \Delta \vdash T, L ,U ok ? or is \Delta \vdashh ... sufficient?
% %<A> m(List<? extends A> l)
% %This is important because it means different things maybe for the proof of our OK being more restrictive than "witnessed"
% % where can nested wildcards occur?
% WBox<X> extends Box<Box<? extends X>>
% WBox<?> => Y.WBox<Y> <: Y.Box<X^Y.Box<X>>
% Everything else regarding subtyping stays the same as in \cite{WildcardsNeedWitnessProtection}.
% \begin{lemma}
% If $\Delta \vdash $
% \end{lemma}
2024-01-04 00:33:36 +00:00
2023-12-31 02:32:26 +00:00
Figure \ref { fig:tletexpr} shows type rules for fields and method calls.
They have been merged with let statements and simplified.
The let statements and the type $ \wcNtype { \Delta ' } { N } $ , which the type inference algorithm can freely choose,
are necessary for the soundness proof.
\begin { figure} [tp]
$ \begin { array } { l }
\typerule { T-Var} \\
\begin { array} { @{ } c}
x : \type { T} \in \Gamma
\\
\hline
\vspace * { -0.3cm} \\
\Delta | \Gamma \vdash x : \type { T}
\end { array}
\end { array} $
\\ [1em]
$ \begin { array } { l }
\typerule { T-New} \\
\begin { array} { @{ } c}
\Delta , \overline { \Delta } \vdash \exptype { C} { \ol { T} } \ \ok \quad \quad
\text { fields} (\exptype { C} { \ol { T} } ) = \overline { \type { U} \ f} \quad \quad
\Delta | \Gamma \vdash \overline { t : \type { S} } \quad \quad
\Delta \vdash \overline { \type { S} } <: \overline { \wcNtype { \Delta } { N} } \\
\Delta , \overline { \Delta } \vdash \overline { \type { N} } <: \overline { \type { U} } \quad \quad
\Delta , \overline { \Delta } \vdash \exptype { C} { \ol { T} } <: \type { T} \quad \quad
\overline { \text { dom} (\Delta ) \subseteq \text { fv} (\type { N} )} \quad \quad
\Delta \vdash \type { T} , \overline { \wcNtype { \Delta } { N} } \ \ok
\\
\hline
\vspace * { -0.3cm} \\
\Delta | \Gamma \vdash \letstmt { \ol { x} : \ol { \wcNtype { \Delta } { N} } = \ol { t} } { \texttt { new} \ \exptype { C} { \ol { T} } (\overline { t} )} : \type { T}
\end { array}
\end { array} $
\\ [1em]
$ \begin { array } { l }
\typerule { T-Field} \\
\begin { array} { @{ } c}
\Delta | \Gamma \vdash \texttt { t} : \type { T} \quad \quad
\Delta \vdash \type { T} <: \wcNtype { \Delta '} { N} \quad \quad
\textit { fields} (\type { N} ) = \ol { U\ f} \\
\Delta , \Delta ' \vdash \type { U} _ i <: \type { S} \quad \quad
\text { dom} (\Delta ') \subseteq \text { fv} (\type { N} ) \quad \quad
\Delta \vdash \type { S} , \wcNtype { \Delta '} { N} \ \ok
\\
\hline
\vspace * { -0.3cm} \\
\Delta | \Gamma \vdash \texttt { let} \ x : \wcNtype { \Delta '} { N} = \texttt { t} \ \texttt { in} \ x.\texttt { f} _ i : \type { S}
\end { array}
\end { array} $
\\ [1em]
$ \begin { array } { l }
\typerule { T-Call} \\
\begin { array} { @{ } c}
\Delta , \Delta ', \overline { \Delta } \vdash \ol { \type { N} } <: [\ol { S} /\ol { X} ]\ol { U} \quad \quad
\textit { mtype} (\texttt { m} , \type { N} ) = \generics { \ol { X \triangleleft U'} } \ol { U} \to \type { U} \quad \quad
\Delta , \Delta ', \overline { \Delta } \vdash \ol { S} <: [\ol { S} /\ol { X} ]\ol { U'}
\\
\Delta , \Delta ', \overline { \Delta } \vdash \ol { S} \ \ok \quad \quad
\Delta | \Gamma \vdash \texttt { t} _ r : \type { T} _ r \quad \quad
\Delta | \Gamma \vdash \ol { t} : \ol { T} \quad \quad
\Delta \vdash \type { T} _ r <: \wcNtype { \Delta '} { N} \quad \quad
\Delta \vdash \ol { T} <: \ol { \wcNtype { \Delta } { N} }
\\
\Delta \vdash \type { T} , \wcNtype { \Delta '} { N} , \overline { \wcNtype { \Delta } { N} } \ \ok \quad \quad
\Delta , \Delta ', \Delta '' \vdash [\ol { S} /\ol { X} ]\type { U} <: \type { T} \quad \quad
\text { dom} (\Delta ') \subseteq \text { fv} (\type { N} ) \quad \quad
\overline { \text { dom} (\Delta ) \subseteq \text { fv} (\type { N} )}
\\
\hline
\vspace * { -0.3cm} \\
\Delta | \Gamma \vdash \letstmt { x : \wcNtype { \Delta '} { N} = t_ r, \ol { x} : \ol { \wcNtype { \Delta } { N} } = \ol { t} }
{ \texttt { x} .\generics { \ol { S} } \texttt { m} (\ol { x} )} : \type { T}
\end { array}
\end { array} $
\\ [1em]
$ \begin { array } { l }
\typerule { T-Elvis} \\
\begin { array} { @{ } c}
\Delta | \Gamma \vdash t_ 1 : \type { T} _ 1 \quad \quad
\Delta | \Gamma \vdash t_ 2 : \type { T} _ 2 \quad \quad
\Delta \vdash \type { T} _ 1 <: \type { T} \quad \quad
\Delta \vdash \type { T} _ 2 <: \type { T}
\\
\hline
\vspace * { -0.3cm} \\
\Delta | \Gamma \vdash t_ 1 \elvis { } t_ 2 : \type { T}
\end { array}
\end { array} $
\\ [1em]
$ \begin { array } { l }
\typerule { T-Method} \\
\begin { array} { @{ } c}
\text { dom} (\Delta )=\ol { X} \quad \quad
\Delta ' = \overline { \type { Y} : \bot .. \type { U} } \quad \quad
\Delta , \Delta ' \vdash \ol { U} , \type { T} , \ol { T} \ \ok \quad \quad
\texttt { class} \ \exptype { C} { \ol { X \triangleleft \_ } } \triangleleft \type { N} \set { \ldots } \\
\Delta , \Delta ' | \overline { x:\type { T} } , \texttt { this} : \exptype { C} { \ol { X} } \vdash t:\type { S} \quad \quad
\Delta , \Delta ' \vdash \type { S} <: \type { T} \quad \quad
\text { override} (\texttt { m} , \type { N} , \generics { \ol { Y \triangleleft U} } \ol { T} \to \type { T} )
\\
\hline
\vspace * { -0.3cm} \\
\Delta \vdash \generics { \ol { Y \triangleleft U} } \type { T} \ \texttt { m} (\overline { \type { T} \ x} ) = t \ \ok \ \texttt { in C}
\end { array}
\end { array} $
\\ [1em]
$ \begin { array } { l }
\typerule { T-Class} \\
\begin { array} { @{ } c}
\Delta = \overline { \type { X} : \bot .. \type { U} } \quad \quad
\Delta \vdash \ol { U} , \ol { T} \ \ok \quad \quad
\Delta \vdash \type { N} \ \ok \quad \quad
\Delta \vdash \ol { M} \ \ok \texttt { in C}
\\
\hline
\vspace * { -0.3cm} \\
\texttt { class} \ \exptype { C} { \ol { X \triangleleft U} } \triangleleft \type { N} \set { \overline { \type { T} \ f} ; \ol { M} } \ \ok
\end { array}
\end { array} $
\caption { T-Call and T-Field} \label { fig:tletexpr}
\end { figure}