§9.2.1 Parameter substitution

Substitution of a type anchor of a class 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.

(a) Instance constrained type parameters

In addition to normal usage, a value parameter can be applied nested to a regular type parameter:

class MyClass<YourType aName, DependentParam<@aName>> { ...

Here the type parameter DependentParam is constrained to be anchored to aName.

If a value parameter is used as a constraint for a regular type parameter any substitution for the type parameter must also supply a value matching the value parameter. The class from above could be applied like this:

final YourType anchor = new YourType();
MyClass <@anchor, YourDependent<@anchor>>

Within the declaring element (class or method) applications of the type variable representing the instance constrained type parameter must repeat the anchor verbatim, i.e., no substitutions are performed here.