mapped_pages:
Use the method call operator '()' to call a member method on a reference type value. Implicit boxing/unboxing is evaluated as necessary per argument during the method call. When a method call is made on a target def type value, the parameters and return type value are considered to also be of the def type and are evaluated at run-time.
An overloaded method is one that shares the same name with two or more methods. A method is overloaded based on arity where the same name is re-used for multiple methods as long as the number of parameters differs.
Errors
null.Grammar
method_call: '.' ID arguments;
arguments: '(' (expression (',' expression)*)? ')';
Examples
Method calls on different reference types.
Map m = new HashMap(); <1>
m.put(1, 2); <2>
int z = m.get(1); <3>
def d = new ArrayList(); <4>
d.add(1); <5>
int i = Integer.parseInt(d.get(0).toString()); <6>
Map m; allocate HashMap instance → HashMap reference; store HashMap reference to mm → Map reference; implicit cast int 1 to def → def; implicit cast int 2 to def → def; call put on Map reference with arguments (int 1, int 2)int z; load from m → Map reference; call get on Map reference with arguments (int 1) → def; implicit cast def to int 2 → int 2; store int 2 to zdef d; allocate ArrayList instance → ArrayList reference; implicit cast ArrayList to def → def; store def to dd → def; implicit cast def to ArrayList reference → ArrayList reference call add on ArrayList reference with arguments (int 1);int i; load from d → def; implicit cast def to ArrayList reference → ArrayList reference call get on ArrayList reference with arguments (int 1) → def; implicit cast def to Integer 1 reference → Integer 1 reference; call toString on Integer 1 reference → String '1'; call parseInt on Integer with arguments (String '1') → int 1; store int 1 in i;Use the field access operator '.' to store a value to or load a value from a reference type member field.
Errors
null.Grammar
field_access: '.' ID;
Examples
The examples use the following reference type definition:
name:
Example
non-static member fields:
* int x
* def y
* List z
Field access with the Example type.
Example example = new Example(); <1>
example.x = 1; <2>
example.y = example.x; <3>
example.z = new ArrayList(); <4>
example.z.add(1); <5>
example.x = example.z.get(0); <6>
Example example; allocate Example instance → Example reference; store Example reference to exampleexample → Example reference; store int 1 to x of Example referenceexample → Example reference @0; load from example → Example reference @1; load from x of Example reference @1 → int 1; implicit cast int 1 to def → def; store def to y of Example reference @0; (note Example reference @0 and Example reference @1 are the same)example → Example reference; allocate ArrayList instance → ArrayList reference; implicit cast ArrayList reference to List reference → List reference; store List reference to z of Example referenceexample → Example reference; load from z of Example reference → List reference; call add on List reference with arguments (int 1)example → Example reference @0; load from example → Example reference @1; load from z of Example reference @1 → List reference; call get on List reference with arguments (int 0) → int 1; store int 1 in x of List reference @0; (note Example reference @0 and Example reference @1 are the same)Use the null safe operator '?.' instead of the method call operator or field access operator to ensure a reference type value is non-null before a method call or field access. A null value will be returned if the reference type value is null, otherwise the method call or field access is evaluated.
Errors
Grammar
null_safe: null_safe_method_call
| null_safe_field_access
;
null_safe_method_call: '?.' ID arguments;
arguments: '(' (expression (',' expression)*)? ')';
null_safe_field_access: '?.' ID;
Examples
The examples use the following reference type definition:
name:
Example
non-static member methods:
* List factory()
non-static member fields:
* List x
Null safe without a null value.
Example example = new Example(); <1>
List x = example?.factory(); <2>
Example example; allocate Example instance → Example reference; store Example reference to exampleList x; load from example → Example reference; null safe call factory on Example reference → List reference; store List reference to x;Null safe with a null value;
Example example = null; <1>
List x = example?.x; <2>
Example example; store null to exampleList x; load from example → Example reference; null safe access x on Example reference → null; store null to x; (note the null safe operator returned null because example is null)Use the list initialization operator '[]' to allocate an List type instance to the heap with a set of pre-defined values. Each value used to initialize the List type instance is cast to a def type value upon insertion into the List type instance using the add method. The order of the specified values is maintained.
Grammar
list_initialization: '[' expression (',' expression)* ']'
| '[' ']';
Examples
List initialization of an empty List type value.
List empty = []; <1>
List empty; allocate ArrayList instance → ArrayList reference; implicit cast ArrayList reference to List reference → List reference; store List reference to emptyList initialization with static values.
List list = [1, 2, 3]; <1>
List list; allocate ArrayList instance → ArrayList reference; call add on ArrayList reference with arguments(int 1); call add on ArrayList reference with arguments(int 2); call add on ArrayList reference with arguments(int 3); implicit cast ArrayList reference to List reference → List reference; store List reference to listList initialization with non-static values.
int i = 1; <1>
long l = 2L; <2>
float f = 3.0F; <3>
double d = 4.0; <4>
String s = "5"; <5>
List list = [i, l, f*d, s]; <6>
int i; store int 1 to ilong l; store long 2 to lfloat f; store float 3.0 to fdouble d; store double 4.0 to dString s; store String "5" to sList list; allocate ArrayList instance → ArrayList reference; load from i → int 1; call add on ArrayList reference with arguments(int 1); load from l → long 2; call add on ArrayList reference with arguments(long 2); load from f → float 3.0; load from d → double 4.0; promote float 3.0 and double 4.0: result double; implicit cast float 3.0 to double 3.0 → double 3.0; multiply double 3.0 and double 4.0 → double 12.0; call add on ArrayList reference with arguments(double 12.0); load from s → String "5"; call add on ArrayList reference with arguments(String "5"); implicit cast ArrayList reference to List reference → List reference; store List reference to listUse the list access operator '[]' as a shortcut for a set method call or get method call made on a List type value.
Errors
List type value is accessed.set method call or get method call.Grammar
list_access: '[' expression ']'
Examples
List access with the List type.
List list = new ArrayList(); <1>
list.add(1); <2>
list.add(2); <3>
list.add(3); <4>
list[0] = 2; <5>
list[1] = 5; <6>
int x = list[0] + list[1]; <7>
int y = 1; <8>
int z = list[y]; <9>
List list; allocate ArrayList instance → ArrayList reference; implicit cast ArrayList reference to List reference → List reference; store List reference to listlist → List reference; call add on List reference with arguments(int 1)list → List reference; call add on List reference with arguments(int 2)list → List reference; call add on List reference with arguments(int 3)list → List reference; call set on List reference with arguments(int 0, int 2)list → List reference; call set on List reference with arguments(int 1, int 5)int x; load from list → List reference; call get on List reference with arguments(int 0) → def; implicit cast def to int 2 → int 2; load from list → List reference; call get on List reference with arguments(int 1) → def; implicit cast def to int 5 → int 5; add int 2 and int 5 → int 7; store int 7 to xint y; store int 1 int yint z; load from list → List reference; load from y → int 1; call get on List reference with arguments(int 1) → def; implicit cast def to int 5 → int 5; store int 5 to zList access with the def type.
def d = new ArrayList(); <1>
d.add(1); <2>
d.add(2); <3>
d.add(3); <4>
d[0] = 2; <5>
d[1] = 5; <6>
def x = d[0] + d[1]; <7>
def y = 1; <8>
def z = d[y]; <9>
List d; allocate ArrayList instance → ArrayList reference; implicit cast ArrayList reference to def → def; store def to dd → def; implicit cast def to ArrayList reference → ArrayList reference; call add on ArrayList reference with arguments(int 1)d → def; implicit cast def to ArrayList reference → ArrayList reference; call add on ArrayList reference with arguments(int 2)d → def; implicit cast def to ArrayList reference → ArrayList reference; call add on ArrayList reference with arguments(int 3)d → def; implicit cast def to ArrayList reference → ArrayList reference; call set on ArrayList reference with arguments(int 0, int 2)d → def; implicit cast def to ArrayList reference → ArrayList reference; call set on ArrayList reference with arguments(int 1, int 5)def x; load from d → def; implicit cast def to ArrayList reference → ArrayList reference; call get on ArrayList reference with arguments(int 0) → def; implicit cast def to int 2 → int 2; load from d → def; implicit cast def to ArrayList reference → ArrayList reference; call get on ArrayList reference with arguments(int 1) → def; implicit cast def to int 2 → int 2; add int 2 and int 5 → int 7; store int 7 to xint y; store int 1 int yint z; load from d → ArrayList reference; load from y → def; implicit cast def to int 1 → int 1; call get on ArrayList reference with arguments(int 1) → def; store def to zUse the map initialization operator '[:]' to allocate a Map type instance to the heap with a set of pre-defined values. Each pair of values used to initialize the Map type instance are cast to def type values upon insertion into the Map type instance using the put method.
Grammar
map_initialization: '[' key_pair (',' key_pair)* ']'
| '[' ':' ']';
key_pair: expression ':' expression
Examples
Map initialization of an empty Map type value.
Map empty = [:]; <1>
Map empty; allocate HashMap instance → HashMap reference; implicit cast HashMap reference to Map reference → Map reference; store Map reference to emptyMap initialization with static values.
Map map = [1:2, 3:4, 5:6]; <1>
Map map; allocate HashMap instance → HashMap reference; call put on HashMap reference with arguments(int 1, int 2); call put on HashMap reference with arguments(int 3, int 4); call put on HashMap reference with arguments(int 5, int 6); implicit cast HashMap reference to Map reference → Map reference; store Map reference to mapMap initialization with non-static values.
byte b = 0; <1>
int i = 1; <2>
long l = 2L; <3>
float f = 3.0F; <4>
double d = 4.0; <5>
String s = "5"; <6>
Map map = [b:i, l:f*d, d:s]; <7>
byte b; store byte 0 to bint i; store int 1 to ilong l; store long 2 to lfloat f; store float 3.0 to fdouble d; store double 4.0 to dString s; store String "5" to sMap map; allocate HashMap instance → HashMap reference; load from b → byte 0; load from i → int 1; call put on HashMap reference with arguments(byte 0, int 1); load from l → long 2; load from f → float 3.0; load from d → double 4.0; promote float 3.0 and double 4.0: result double; implicit cast float 3.0 to double 3.0 → double 3.0; multiply double 3.0 and double 4.0 → double 12.0; call put on HashMap reference with arguments(long 2, double 12.0); load from d → double 4.0; load from s → String "5"; call put on HashMap reference with arguments(double 4.0, String "5"); implicit cast HashMap reference to Map reference → Map reference; store Map reference to mapUse the map access operator '[]' as a shortcut for a put method call or get method call made on a Map type value.
Errors
Map type value is accessed.Grammar
map_access: '[' expression ']'
Examples
Map access with the Map type.
Map map = new HashMap(); <1>
map['value2'] = 2; <2>
map['value5'] = 5; <3>
int x = map['value2'] + map['value5']; <4>
String y = 'value5'; <5>
int z = x[z]; <6>
Map map; allocate HashMap instance → HashMap reference; implicit cast HashMap reference to Map reference → Map reference; store Map reference to mapmap → Map reference; call put on Map reference with arguments(String 'value2', int 2)map → Map reference; call put on Map reference with arguments(String 'value5', int 5)int x; load from map → Map reference; call get on Map reference with arguments(String 'value2') → def; implicit cast def to int 2 → int 2; load from map → Map reference; call get on Map reference with arguments(String 'value5') → def; implicit cast def to int 5 → int 5; add int 2 and int 5 → int 7; store int 7 to xString y; store String 'value5' to yint z; load from map → Map reference; load from y → String 'value5'; call get on Map reference with arguments(String 'value5') → def; implicit cast def to int 5 → int 5; store int 5 to zMap access with the def type.
def d = new HashMap(); <1>
d['value2'] = 2; <2>
d['value5'] = 5; <3>
int x = d['value2'] + d['value5']; <4>
String y = 'value5'; <5>
def z = d[y]; <6>
def d; allocate HashMap instance → HashMap reference; implicit cast HashMap reference to def → def; store def to dd → def; implicit cast def to HashMap reference → HashMap reference; call put on HashMap reference with arguments(String 'value2', int 2)d → def; implicit cast def to HashMap reference → HashMap reference; call put on HashMap reference with arguments(String 'value5', int 5)int x; load from d → def; implicit cast def to HashMap reference → HashMap reference; call get on HashMap reference with arguments(String 'value2') → def; implicit cast def to int 2 → int 2; load from d → def; call get on HashMap reference with arguments(String 'value5') → def; implicit cast def to int 5 → int 5; add int 2 and int 5 → int 7; store int 7 to xString y; store String 'value5' to ydef z; load from d → def; load from y → String 'value5'; call get on HashMap reference with arguments(String 'value5') → def; store def to zUse the new instance operator 'new ()' to allocate a reference type instance to the heap and call a specified constructor. Implicit boxing/unboxing is evaluated as necessary per argument during the constructor call.
An overloaded constructor is one that shares the same name with two or more constructors. A constructor is overloaded based on arity where the same reference type name is re-used for multiple constructors as long as the number of parameters differs.
Errors
Grammar
new_instance: 'new' TYPE '(' (expression (',' expression)*)? ')';
Examples
Allocation of new instances with different types.
Map m = new HashMap(); <1>
def d = new ArrayList(); <2>
def e = new HashMap(m); <3>
Map m; allocate HashMap instance → HashMap reference; implicit cast HashMap reference to Map reference → Map reference; store Map reference to m;def d; allocate ArrayList instance → ArrayList reference; implicit cast ArrayList reference to def → def; store def to d;def e; load from m → Map reference; allocate HashMap instance with arguments (Map reference) → HashMap reference; implicit cast HashMap reference to def → def; store def to e;Use the string concatenation operator '+' to concatenate two values together where at least one of the values is a String type.
Grammar
concatenate: expression '+' expression;
Examples
String concatenation with different primitive types.
String x = "con"; <1>
String y = x + "cat"; <2>
String z = 4 + 5 + x; <3>
String x; store String "con" to x;String y; load from x → String "con"; concat String "con" and String "cat" → String "concat"; store String "concat" to yString z; add int 4 and int 5 → int 9; concat int 9 and String "9concat"; store String "9concat" to z; (note the addition is done prior to the concatenation due to precedence and associativity of the specific operations)String concatenation with the def type.
def d = 2; <1>
d = "con" + d + "cat"; <2>
def; implicit cast int 2 to def → def; store def in d;String "con" and int 2 → String "con2"; concat String "con2" and String "cat" → String "con2cat" implicit cast String "con2cat" to def → def; store def to d; (note the switch in type of d from int to String)An elvis consists of two expressions. The first expression is evaluated with to check for a null value. If the first expression evaluates to null then the second expression is evaluated and its value used. If the first expression evaluates to non-null then the resultant value of the first expression is used. Use the elvis operator '?:' as a shortcut for the conditional operator.
Errors
null value.Grammar
elvis: expression '?:' expression;
Examples
Elvis with different reference types.
List x = new ArrayList(); <1>
List y = x ?: new ArrayList(); <2>
y = null; <3>
List z = y ?: new ArrayList(); <4>
List x; allocate ArrayList instance → ArrayList reference; implicit cast ArrayList reference to List reference → List reference; store List reference to x;List y; load x → List reference; List reference equals null → false; evaluate 1st expression: List reference → List reference; store List reference to ynull to y;List z; load y → List reference; List reference equals null → true; evaluate 2nd expression: allocate ArrayList instance → ArrayList reference; implicit cast ArrayList reference to List reference → List reference; store List reference to z;