ObjectTeams/Java Language Definition - §9.
|
|
Table of |
| §9. Value Dependent Classes |
Generalizing externalized roles
![]() |
|
| Type Value Parameter | In addition to regular generics, a class may declare parameters that represent an object value. Such a value parameter is called the type anchor for this class, the class's type is said to be anchored to this parameter. |
![]() |
|
| Value Dependent Classes | A class that declares one or more value parameters depends on the runtime instance(s) denoted by its anchor(s). |
![]() |
|
| Externalized Roles | The concept of externalized roles (§ 1.2.2) is a special case of the concepts presented here. |
![]() |
|
§9.1. Defining classes with value parameters
(a) Value parameter declaration
(b) Value parameter application
(c) Role types as dependent types
Within the angle brackets that mark the parameters of a generic class also value parameters can be declared. In contrast to
a type parameter, a value parameter is denoted as a pair of two identifiers: a type and a free name, e.g.,
class MyClass<YourType aName>; { ...
Note that value parameters are valid for classes only, not for interfaces.
Within the given class (MyClass) the parameter name (aName) can be used like a final field of the given type (YourType). In contrast to regular final fields the assignment to this name occurrs even before the constructor is executed.
Any role type can be interpreted as a value dependent type, however, in the declaration of a role type the value parameter
remains implicit: it is identical to the enclosing team instance.
§9.2. Using classes with value parameters
When using a class which declares one or more value parameters (type anchors) a corresponding anchor value has to be provided.
§9.2.1. Parameter substitution
Substitution of a type anchor of a class
The value passed for substituting a type anchor must be a path of variables declared as
Note: Externalized roles as defined in §1.2.2(b) are a special case of types with a value parameter, where the value is an instance of the enclosing team.
MyClass<YourType p> is denoted as
MyClass<@v>.
In this term v must be a value which is conform to the declaration of the value parameter "YourType p", ie., v must have the static type YourType.The value passed for substituting a type anchor must be a path of variables declared as
final.
Obviously, only the first element in such a path can be
a local variable or a method argument, all other elements
have to be fields. The reason for requiring final variables is
in type checking as discussed next.Note: Externalized roles as defined in §1.2.2(b) are a special case of types with a value parameter, where the value is an instance of the enclosing team.
§9.2.2. Type conformance
Two value dependent types (anchored types) are considered conform only if the anchors of both types refer to the same object(s). The compiler must be able to statically analyze this anchor identity.
(a) Substitutions for type anchors
Only two substitutions are considered for determining
anchor identity:
(b) Conformance of raw types-
If a method signature uses
thisas the anchor of any of its types, type checking an application of this method performs the following substitutions:
A simplethisexpression is substituted by the actual call target of the method application.
A qualifiedOuter.thisexpression is substituted by the corresponding enclosing instance of the call target. -
Assignments from a
finalidentifier to anotherfinalidentifier are transitively followed, i.e., ift1, t2are final, after an assignmentt1=t2the typesC<@t1>andC<@t2>are considered identical. OtherwiseC<@t1>andC<@t2>are incommensurable.
Attaching an actual parameter to a formal parameter in a method call is also considered as an assignment with respect to this rule.
After anchors have been proven identical, the raw types are checked for compatibility using the standard Java rules.
§9.3. Restrictions and limitations
(a) No overriding
Types with value parameters that are declared outside a team cannot be overridden, as roles can be. Therefor, implicit inheritance
does not apply for these types.
Currently only the first parameter of a class may be a value parameter. This restriction may be removed in the future.
|
|
Table of |
© Stephan Herrmann, Christine Hundt
OT/J Version 1.0 — Last modified: Fri Mar 30 2007

