运算符:参考
编辑运算符:参考编辑
方法调用编辑
使用 方法调用运算符 '()'
在 引用类型 值上调用成员方法。在方法调用期间,根据参数需要进行隐式 装箱/拆箱。当对目标 def
类型值进行方法调用时,参数和返回值类型值也被认为是 def
类型,并在运行时进行评估。
重载方法是指名称相同但参数数量不同的多个方法。方法重载基于参数数量,即只要参数数量不同,就可以使用相同的名称来定义多个方法。
错误
- 如果引用类型值为
null
。 - 如果给定引用类型值不存在成员方法名称。
- 如果传入的参数数量与指定参数的数量不同。
- 如果参数无法隐式转换为参数的正确类型值或无法隐式装箱/拆箱。
语法
method_call: '.' ID arguments; arguments: '(' (expression (',' expression)*)? ')';
示例
-
对不同引用类型进行方法调用。
Map m = new HashMap(); m.put(1, 2); int z = m.get(1); def d = new ArrayList(); d.add(1); int i = Integer.parseInt(d.get(0).toString());
声明
Map m
;分配HashMap
实例 →HashMap 引用
;将HashMap 引用
存储到m
从
m
加载 →Map 引用
;隐式将int 1
转换为def
→def
;隐式将int 2
转换为def
→def
;使用参数 (int 1
,int 2
) 在Map 引用
上调用put
声明
int z
;从m
加载 →Map 引用
;使用参数 (int 1
) 在Map 引用
上调用get
→def
;隐式将def
转换为int 2
→int 2
;将int 2
存储到z
声明
def d
;分配ArrayList
实例 →ArrayList 引用
;隐式将ArrayList
转换为def
→def
;将def
存储到d
从
d
加载 →def
;隐式将def
转换为ArrayList 引用
→ArrayList 引用
使用参数 (int 1
) 在ArrayList 引用
上调用add
;声明
int i
;从d
加载 →def
;隐式将def
转换为ArrayList 引用
→ArrayList 引用
使用参数 (int 1
) 在ArrayList 引用
上调用get
→def
;隐式将def
转换为Integer 1 引用
→Integer 1 引用
;在Integer 1 引用
上调用toString
→String '1'
;使用参数 (String '1'
) 在Integer
上调用parseInt
→int 1
;将int 1
存储到i
中;
字段访问编辑
使用 字段访问运算符 '.'
将值存储到 引用类型 成员字段或从成员字段加载值。
错误
- 如果引用类型值为
null
。 - 如果给定引用类型值不存在成员字段名称。
语法
field_access: '.' ID;
示例
示例使用以下引用类型定义
name: Example non-static member fields: * int x * def y * List z
-
使用
Example
类型进行字段访问。Example example = new Example(); example.x = 1; example.y = example.x; example.z = new ArrayList(); example.z.add(1); example.x = example.z.get(0);
声明
Example example
;分配Example
实例 →Example 引用
;将Example 引用
存储到example
从
example
加载 →Example 引用
;将int 1
存储到Example 引用
的x
中从
example
加载 →Example 引用 @0
;从example
加载 →Example 引用 @1
;从Example 引用 @1
的x
加载 →int 1
;隐式将int 1
转换为def
→def
;将def
存储到Example 引用 @0
的y
中;(注意Example 引用 @0
和Example 引用 @1
是相同的)从
example
加载 →Example 引用
;分配ArrayList
实例 →ArrayList 引用
;隐式将ArrayList 引用
转换为List 引用
→List 引用
;将List 引用
存储到Example 引用
的z
中从
example
加载 →Example 引用
;从Example 引用
的z
加载 →List 引用
;使用参数 (int 1
) 在List 引用
上调用add
从
example
加载 →Example 引用 @0
;从example
加载 →Example 引用 @1
;从Example 引用 @1
的z
加载 →List 引用
;使用参数 (int 0
) 在List 引用
上调用get
→int 1
;将int 1
存储到List 引用 @0
的x
中;(注意Example 引用 @0
和Example 引用 @1
是相同的)
空安全编辑
使用 空安全运算符 '?.'
而不是方法调用运算符或字段访问运算符,以确保引用类型值在方法调用或字段访问之前为 非空
。如果引用类型值为 null
,则返回 null
值,否则评估方法调用或字段访问。
错误
- 如果方法调用返回值类型或字段访问类型值不是引用类型值,并且无法隐式转换为引用类型值。
语法
null_safe: null_safe_method_call | null_safe_field_access ; null_safe_method_call: '?.' ID arguments; arguments: '(' (expression (',' expression)*)? ')'; null_safe_field_access: '?.' ID;
示例
示例使用以下引用类型定义
name: Example non-static member methods: * List factory() non-static member fields: * List x
-
没有
null
值的空安全。 -
具有
null
值的空安全;
列表初始化编辑
使用 列表初始化运算符 '[]'
在堆上分配一个具有预定义值的 List
类型实例。用于初始化 List
类型实例的每个值在使用 add
方法插入到 List
类型实例时都会被转换为 def
类型值。指定值的顺序将被保留。
语法
list_initialization: '[' expression (',' expression)* ']' | '[' ']';
示例
-
空
List
类型值的列表初始化。 -
使用静态值的列表初始化。
-
使用非静态值的列表初始化。
声明
int i
;将int 1
存储到i
声明
long l
;将long 2
存储到l
声明
float f
;将float 3.0
存储到f
声明
double d
;将double 4.0
存储到d
声明
String s
;将String "5"
存储到s
声明
List list
;分配ArrayList
实例 →ArrayList 引用
;从i
加载 →int 1
;在ArrayList 引用
上调用add
方法,参数为 (int 1
);从l
加载 →long 2
;在ArrayList 引用
上调用add
方法,参数为 (long 2
);从f
加载 →float 3.0
;从d
加载 →double 4.0
;提升float 3.0
和double 4.0
:结果为double
;隐式转换float 3.0
为double 3.0
→double 3.0
;将double 3.0
和double 4.0
相乘 →double 12.0
;在ArrayList 引用
上调用add
方法,参数为 (double 12.0
);从s
加载 →String "5"
;在ArrayList 引用
上调用add
方法,参数为 (String "5"
);隐式转换ArrayList 引用
为List 引用
→List 引用
;将List 引用
存储到list
列表访问edit
使用 列表访问运算符 '[]'
作为对 List
类型值的 set
方法调用或 get
方法调用的快捷方式。
错误
- 如果访问的值不是
List
类型的值。 - 如果使用非整数类型的值作为
set
方法调用或get
方法调用的索引。
语法
list_access: '[' expression ']'
示例
-
使用
List
类型进行列表访问。List list = new ArrayList(); list.add(1); list.add(2); list.add(3); list[0] = 2; list[1] = 5; int x = list[0] + list[1]; int y = 1; int z = list[y];
声明
List list
;分配ArrayList
实例 →ArrayList 引用
;隐式转换ArrayList 引用
为List 引用
→List 引用
;将List 引用
存储到list
从
list
加载 →List 引用
;在List 引用
上调用add
方法,参数为 (int 1
)从
list
加载 →List 引用
;在List 引用
上调用add
方法,参数为 (int 2
)从
list
加载 →List 引用
;在List 引用
上调用add
方法,参数为 (int 3
)从
list
加载 →List 引用
;在List 引用
上调用set
方法,参数为 (int 0
,int 2
)从
list
加载 →List 引用
;在List 引用
上调用set
方法,参数为 (int 1
,int 5
)声明
int x
;从list
加载 →List 引用
;在List 引用
上调用get
方法,参数为 (int 0
) →def
;隐式转换def
为int 2
→int 2
;从list
加载 →List 引用
;在List 引用
上调用get
方法,参数为 (int 1
) →def
;隐式转换def
为int 5
→int 5
;将int 2
和int 5
相加 →int 7
;将int 7
存储到x
声明
int y
;将int 1
存储到y
中声明
int z
;从list
加载 →List 引用
;从y
加载 →int 1
;在List 引用
上调用get
方法,参数为 (int 1
) →def
;隐式转换def
为int 5
→int 5
;将int 5
存储到z
-
使用
def
类型进行列表访问。def d = new ArrayList(); d.add(1); d.add(2); d.add(3); d[0] = 2; d[1] = 5; def x = d[0] + d[1]; def y = 1; def z = d[y];
声明
List d
;分配ArrayList
实例 →ArrayList 引用
;隐式转换ArrayList 引用
为def
→def
;将def
存储到d
从
d
加载 →def
;隐式转换def
为ArrayList 引用
→ArrayList 引用
;在ArrayList 引用
上调用add
方法,参数为 (int 1
)从
d
加载 →def
;隐式转换def
为ArrayList 引用
→ArrayList 引用
;在ArrayList 引用
上调用add
方法,参数为 (int 2
)从
d
加载 →def
;隐式转换def
为ArrayList 引用
→ArrayList 引用
;在ArrayList 引用
上调用add
方法,参数为 (int 3
)从
d
加载 →def
;隐式转换def
为ArrayList 引用
→ArrayList 引用
;在ArrayList 引用
上调用set
方法,参数为 (int 0
,int 2
)从
d
加载 →def
;隐式转换def
为ArrayList 引用
→ArrayList 引用
;在ArrayList 引用
上调用set
方法,参数为 (int 1
,int 5
)声明
def x
;从d
加载 →def
;隐式转换def
为ArrayList 引用
→ArrayList 引用
;在ArrayList 引用
上调用get
方法,参数为 (int 0
) →def
;隐式转换def
为int 2
→int 2
;从d
加载 →def
;隐式转换def
为ArrayList 引用
→ArrayList 引用
;在ArrayList 引用
上调用get
方法,参数为 (int 1
) →def
;隐式转换def
为int 2
→int 2
;将int 2
和int 5
相加 →int 7
;将int 7
存储到x
声明
int y
;将int 1
存储到y
中声明
int z
;从d
加载 →ArrayList 引用
;从y
加载 →def
;隐式转换def
为int 1
→int 1
;在ArrayList 引用
上调用get
方法,参数为 (int 1
) →def
;将def
存储到z
映射初始化edit
使用 映射初始化运算符 '[:]'
在堆上分配一个 Map
类型实例,并设置一组预定义的值。用于初始化 Map
类型实例的每一对值在插入到 Map
类型实例中时,使用 put
方法转换为 def
类型的值。
语法
map_initialization: '[' key_pair (',' key_pair)* ']' | '[' ':' ']'; key_pair: expression ':' expression
示例
-
空
Map
类型值的映射初始化。 -
使用静态值进行映射初始化。
-
使用非静态值进行映射初始化。
byte b = 0; int i = 1; long l = 2L; float f = 3.0F; double d = 4.0; String s = "5"; Map map = [b:i, l:f*d, d:s];
声明
byte b
;将byte 0
存储到b
声明
int i
;将int 1
存储到i
声明
long l
;将long 2
存储到l
声明
float f
;将float 3.0
存储到f
声明
double d
;将double 4.0
存储到d
声明
String s
;将String "5"
存储到s
声明
Map map
;分配HashMap
实例 →HashMap 引用
;从b
加载 →字节 0
;从i
加载 →整数 1
;在HashMap 引用
上调用put
,参数为 (字节 0
,整数 1
);从l
加载 →长整型 2
;从f
加载 →浮点型 3.0
;从d
加载 →双精度浮点型 4.0
;提升浮点型 3.0
和双精度浮点型 4.0
:结果双精度浮点型
;隐式转换浮点型 3.0
为双精度浮点型 3.0
→双精度浮点型 3.0
;将双精度浮点型 3.0
和双精度浮点型 4.0
相乘 →双精度浮点型 12.0
;在HashMap 引用
上调用put
,参数为 (长整型 2
,双精度浮点型 12.0
);从d
加载 →双精度浮点型 4.0
;从s
加载 →字符串 "5"
;在HashMap 引用
上调用put
,参数为 (双精度浮点型 4.0
,字符串 "5"
);隐式转换HashMap 引用
为Map 引用
→Map 引用
;将Map 引用
存储到map
Map 访问edit
使用 map 访问运算符 '[]'
作为对 Map
类型值的 put
方法调用或 get
方法调用的快捷方式。
错误
- 如果访问的值不是
Map
类型的值。
语法
map_access: '[' expression ']'
示例
-
使用
Map
类型进行 Map 访问。Map map = new HashMap(); map['value2'] = 2; map['value5'] = 5; int x = map['value2'] + map['value5']; String y = 'value5'; int z = x[z];
声明
Map map
;分配HashMap
实例 →HashMap 引用
;隐式转换HashMap 引用
为Map 引用
→Map 引用
;将Map 引用
存储到map
从
map
加载 →Map 引用
;在Map 引用
上调用put
,参数为 (字符串 'value2'
,整数 2
)从
map
加载 →Map 引用
;在Map 引用
上调用put
,参数为 (字符串 'value5'
,整数 5
)声明
int x
;从map
加载 →Map 引用
;在Map 引用
上调用get
,参数为 (字符串 'value2'
) →def
;隐式转换def
为整数 2
→整数 2
;从map
加载 →Map 引用
;在Map 引用
上调用get
,参数为 (字符串 'value5'
) →def
;隐式转换def
为整数 5
→整数 5
;将整数 2
和整数 5
相加 →整数 7
;将整数 7
存储到x
声明
String y
;将字符串 'value5'
存储到y
声明
int z
;从map
加载 →Map 引用
;从y
加载 →字符串 'value5'
;在Map 引用
上调用get
,参数为 (字符串 'value5'
) →def
;隐式转换def
为整数 5
→整数 5
;将整数 5
存储到z
-
使用
def
类型进行 Map 访问。def d = new HashMap(); d['value2'] = 2; d['value5'] = 5; int x = d['value2'] + d['value5']; String y = 'value5'; def z = d[y];
声明
def d
;分配HashMap
实例 →HashMap 引用
;隐式转换HashMap 引用
为def
→def
;将def
存储到d
从
d
加载 →def
;隐式转换def
为HashMap 引用
→HashMap 引用
;在HashMap 引用
上调用put
,参数为 (字符串 'value2'
,整数 2
)从
d
加载 →def
;隐式转换def
为HashMap 引用
→HashMap 引用
;在HashMap 引用
上调用put
,参数为 (字符串 'value5'
,整数 5
)声明
int x
;从d
加载 →def
;隐式转换def
为HashMap 引用
→HashMap 引用
;在HashMap 引用
上调用get
,参数为 (字符串 'value2'
) →def
;隐式转换def
为整数 2
→整数 2
;从d
加载 →def
;在HashMap 引用
上调用get
,参数为 (字符串 'value5'
) →def
;隐式转换def
为整数 5
→整数 5
;将整数 2
和整数 5
相加 →整数 7
;将整数 7
存储到x
声明
String y
;将字符串 'value5'
存储到y
声明
def z
;从d
加载 →def
;从y
加载 →字符串 'value5'
;在HashMap 引用
上调用get
,参数为 (字符串 'value5'
) →def
;将def
存储到z
新建实例edit
使用 新建实例运算符 'new ()'
在堆上分配 引用类型 实例并调用指定的构造函数。隐式 装箱/拆箱 在构造函数调用期间根据参数需要进行评估。
重载构造函数是指名称相同但参数数量不同的两个或多个构造函数。构造函数根据参数数量进行重载,只要参数数量不同,就可以在多个构造函数中重复使用相同的引用类型名称。
错误
- 如果引用类型名称不存在用于实例分配。
- 如果传入的参数数量与指定参数的数量不同。
- 如果参数无法隐式转换为参数的正确类型值或无法隐式装箱/拆箱。
语法
new_instance: 'new' TYPE '(' (expression (',' expression)*)? ')';
示例
- 使用不同类型分配新的实例。
字符串连接edit
使用 字符串连接运算符 '+'
将两个值连接在一起,其中至少一个值为 字符串类型
。
语法
concatenate: expression '+' expression;
示例
-
使用不同的原始类型进行字符串连接。
-
使用
def
类型进行字符串连接。
Elvisedit
Elvis 由两个表达式组成。第一个表达式被评估以检查 null
值。如果第一个表达式评估为 null
,则评估第二个表达式并使用其值。如果第一个表达式评估为 非空
,则使用第一个表达式的结果值。使用 Elvis 运算符 '?:'
作为条件运算符的快捷方式。
错误
- 如果第一个表达式或第二个表达式不能产生
null
值。
语法
elvis: expression '?:' expression;
示例
-
使用不同的引用类型进行 Elvis。
声明
List x
;分配ArrayList
实例 →ArrayList 引用
;隐式转换ArrayList 引用
为List 引用
→List 引用
;将List 引用
存储到x
;声明
List y
;加载x
→List 引用
;List 引用
等于null
→false
;评估第一个表达式:List 引用
→List 引用
;将List 引用
存储到y
将
null
存储到y
;声明
List z
;加载y
→List 引用
;List 引用
等于null
→true
;评估第二个表达式:分配ArrayList
实例 →ArrayList 引用
;隐式转换ArrayList 引用
到List 引用
→List 引用
;将List 引用
存储到z
中;