类型转换
编辑类型转换
编辑类型转换将原始类型的值转换为目标类型的等效值。隐式转换推断目标类型,并在某些操作期间自动发生。显式转换指定目标类型,并作为其自身操作强制发生。使用cast 运算符 '()'
来指定显式转换。
请参阅转换表,以快速参考所有允许的转换。
错误
- 如果在转换期间目标类型不存在等效值。
- 如果给出了隐式转换,但需要显式转换。
语法
cast: '(' TYPE ')' expression
示例
-
有效的转换。
数值类型转换
编辑数值类型转换将原始数值类型的值转换为目标数值类型的等效值。当原始数值类型的值大于目标数值类型所能容纳的值时,两个数值类型值之间的转换会导致数据丢失。整数类型值和浮点类型值之间的转换可能会导致精度丢失。
下表以行的形式显示了每种数值类型的值允许的转换。
byte |
short |
char |
int |
long |
float |
double |
|
byte |
隐式 |
隐式 |
隐式 |
隐式 |
隐式 |
隐式 |
|
short |
显式 |
显式 |
隐式 |
隐式 |
隐式 |
隐式 |
|
char |
显式 |
显式 |
隐式 |
隐式 |
隐式 |
隐式 |
|
int |
显式 |
显式 |
显式 |
隐式 |
隐式 |
隐式 |
|
long |
显式 |
显式 |
显式 |
显式 |
隐式 |
隐式 |
|
float |
显式 |
显式 |
显式 |
显式 |
显式 |
隐式 |
|
double |
显式 |
显式 |
显式 |
显式 |
显式 |
显式 |
示例
-
有效的数值类型转换。
-
导致错误的无效数值类型转换。
引用类型转换
编辑引用类型转换将原始引用类型的值转换为目标引用类型的等效值。当原始引用类型是目标类型的子类时,允许在两个引用类型值之间进行隐式转换。当原始类型是目标类型的子类或目标类型是原始类型的子类时,允许在两个引用类型值之间进行显式转换。
示例
-
有效的引用类型转换。
声明
List x
;将默认值null
存储到x
声明
ArrayList y
;分配ArrayList
实例 →ArrayList 引用
;将ArrayList 引用
存储到y
;从
y
加载 →ArrayList 引用
;隐式转换ArrayList 引用
为List 引用
→List 引用
;将List 引用
存储到x
;(注意ArrayList
是List
的子类)从
x
加载 →List 引用
;显式转换List 引用
为ArrayList 引用
→ArrayList 引用
;将ArrayList 引用
存储到y
;从
y
加载 →ArrayList 引用
;显式转换ArrayList 引用
为List 引用
→List 引用
;将List 引用
存储到x
;(注意显式转换是多余的,并且隐式转换有效) -
导致错误的无效引用类型转换。
动态类型转换
编辑动态(def
)类型转换将原始 def
类型的值转换为任何目标类型的等效值,或将任何原始类型的值转换为目标 def
类型的等效值。
始终允许从任何原始类型值到 def
类型值的隐式转换。始终允许从任何原始类型值到 def
类型值的显式转换,但从不需要。
当且仅当根据 def
类型值表示的当前类型值通常允许转换时,才允许从原始 def
类型值到任何目标类型值的隐式或显式转换。
示例
-
使用任何原始类型到目标
def
类型的有效动态类型转换。声明
def d0
;隐式转换int 3
为def
;将int 3
存储到d0
分配
ArrayList
实例 →ArrayList 引用
;隐式转换ArrayList 引用
为def
→def
;将def
存储到d0
声明
Object o
;分配HashMap
实例 →HashMap 引用
;隐式转换HashMap 引用
为Object 引用
→Object 引用
;将Object 引用
存储到o
声明
def d1
;从o
加载 →Object 引用
;隐式转换Object 引用
为def
→def
;将def
存储到d1
声明
int i
;从d1
加载 →def
;隐式转换def
为HashMap 引用
→ HashMap 引用`;对HashMap 引用
调用size
→int 0
;将int 0
存储到i
;(注意def
被隐式转换为HashMap 引用
,因为HashMap
是def
类型值表示的最内层子类类型值) -
使用原始
def
类型到任何目标类型的有效动态类型转换。声明
def d
;隐式转换double 1.0
为def
→def
;将def
存储到d
声明
int i
;从d
加载 →def
;隐式转换def
为double 1.0
→double 1.0
;显式转换double 1.0
为int 1
→int 1
;将int 1
存储到i
;(注意,由于double
类型值不会隐式转换为int
类型值,因此需要显式转换)将
int 1
存储到d
;(注意d
表示的类型从double
切换为int
)声明
float i
;从d
加载 →def
;隐式转换def
为int 1
→int 1
;隐式转换int 1
为float 1.0
→float 1.0
;将float 1.0
存储到f
分配
ArrayList
实例 →ArrayList 引用
;将ArrayList 引用
存储到d
;(注意d
表示的类型从int
切换为ArrayList
)声明
List l
;从d
加载 →def
;隐式转换def
为ArrayList 引用
→ArrayList 引用
;隐式转换ArrayList 引用
为List 引用
→List 引用
;将List 引用
存储到l
-
无效的动态类型转换导致错误。
声明
def d
;隐式转换int 1
为def
→def
;将def
存储到d
声明
short s
;从d
加载 →def
;隐式转换def
为int 1
→int 1
;错误 → 无法隐式转换int 1
为short 1
;(注意显式转换是有效的)分配
HashMap
实例 →HashMap 引用
;隐式转换HashMap 引用
为def
→def
;将def
存储到d
声明
List l
;从d
加载 →def
;隐式转换def
为HashMap 引用
;错误 → 无法隐式转换HashMap 引用
为List 引用
;(注意由于HashMap
和List
都不属于对方的子类,因此任何转换都不合法)
字符串到字符的转换
编辑使用强制转换运算符将 String
类型 值转换为 char
类型 值。
错误
- 如果
String
类型的值长度不为 1。 - 如果
String
类型的值为null
。
示例
-
将字符串字面量转换为
char
类型的值。 -
将
String
引用转换为char
类型的值。
装箱和拆箱
编辑装箱是一种特殊的转换类型,用于将基本类型转换为其对应的引用类型。拆箱是相反的操作,用于将引用类型转换为其对应的基本类型。
在以下操作中会发生隐式装箱/拆箱
def
类型和基本类型之间的转换会根据需要隐式地进行装箱/拆箱,尽管在整个文档中将其称为隐式转换。- 方法/函数调用参数会根据需要隐式地进行装箱/拆箱。
- 当对基本类型值调用引用类型方法时,该基本类型值会隐式地进行装箱。
不允许显式装箱/拆箱。使用引用类型 API 显式地将基本类型值转换为其对应的引用类型值,反之亦然。
错误
- 如果进行显式转换以装箱/拆箱基本类型。
示例
-
隐式装箱/拆箱的使用。
声明
List l
;分配ArrayList
实例 →ArrayList 引用
;将ArrayList 引用
存储到l
;从
l
加载 →List 引用
;隐式转换int 1
为def
→def
;使用参数 (def
) 调用List 引用
上的add
方法;(注意,在内部,int 1
会被装箱为Integer 1
以存储为def
类型的值)声明
Integer I
;使用参数 (int 0
) 调用Integer
上的valueOf
方法 →Integer 0
;将Integer 0
存储到I
;声明
int i
;从I
加载 →Integer 0
;拆箱Integer 0
→int 0
;从l
加载 →List 引用
;使用参数 (int 0
) 调用List 引用
上的get
方法 →def
;隐式转换def
为int 1
→int 1
;将int 1
存储到i
;(注意,在内部,当从def
类型的值加载时,int 1
会从Integer 1
拆箱) -
导致错误的无效装箱/拆箱的使用。
提升
编辑提升是指将单个值隐式转换为特定类型,或者将多个值隐式转换为某些操作所需的相同类型。每个需要提升的操作都有一个提升表,该表根据值类型显示所有必需的隐式转换。在编译时提升为 def
类型的值会在运行时根据 def
值表示的类型再次提升。
错误
- 如果特定操作无法为给定值类型找到允许的提升类型。
示例
-
提升的使用。
声明
double d
;提升int 2
和double 2.0 @0
:结果为double
;隐式转换int 2
为double 2.0 @1
→double 2.0 @1
;将double 2.0 @1
和double 2.0 @0
相加 →double 4.0
;将double 4.0
存储到d
声明
def x
;隐式转换int 1
为def
→def
;将def
存储到x
;声明
float f
;从x
加载 →def
;隐式转换def
为int 1
→int 1
;提升int 1
和float 2.0
:结果为float
;隐式转换int 1
为float 1.0
→float `1.0
;将float 1.0
和float 2.0
相加 →float 3.0
;将float 3.0
存储到f
;(注意,此示例说明了在运行时执行的提升,因为在编译时执行的提升将解析为def
类型的值)
允许的转换
编辑以下表格显示所有允许的转换。逐行阅读表格,其中第一列显示原始类型,后续每列指示是否可以隐式 (I)、显式 (E)、仅对方法进行装箱/拆箱 (A)、引用类型转换 (@) 或不允许 (-) 转换为指定的目标类型。有关允许的引用类型转换,请参阅 引用类型转换。
基本类型/引用类型
O |
N |
T |
b |
y |
s |
c |
i |
j |
f |
d |
B |
Y |
S |
C |
I |
J |
F |
D |
R |
def |
|
对象 ( O ) |
@ |
@ |
- |
- |
- |
- |
- |
- |
- |
- |
@ |
@ |
@ |
@ |
@ |
@ |
@ |
@ |
@ |
I |
|
数字 ( N ) |
I |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
@ |
@ |
- |
@ |
@ |
@ |
@ |
@ |
I |
|
字符串 ( T ) |
I |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
E |
- |
- |
- |
- |
- |
I |
|
布尔值 ( b ) |
A |
- |
- |
- |
- |
- |
- |
- |
- |
- |
A |
- |
- |
- |
- |
- |
- |
- |
- |
I |
|
字节 ( y ) |
A |
A |
- |
- |
I |
E |
I |
I |
I |
I |
- |
A |
A |
- |
A |
A |
A |
A |
- |
I |
|
短整型 ( s ) |
A |
A |
- |
- |
E |
E |
I |
I |
I |
I |
- |
- |
A |
- |
A |
A |
A |
A |
- |
I |
|
字符 ( c ) |
A |
- |
E |
- |
E |
E |
I |
I |
I |
I |
- |
- |
- |
A |
A |
A |
A |
A |
- |
I |
|
整型 ( i ) |
A |
A |
- |
- |
E |
E |
E |
I |
I |
I |
- |
- |
- |
- |
A |
A |
A |
A |
- |
I |
|
长整型 ( j ) |
A |
A |
- |
- |
E |
E |
E |
E |
I |
I |
- |
- |
- |
- |
- |
A |
A |
A |
- |
I |
|
浮点型 ( f ) |
A |
A |
- |
- |
E |
E |
E |
E |
E |
I |
- |
- |
- |
- |
- |
- |
A |
A |
- |
I |
|
双精度浮点型 ( d ) |
A |
A |
- |
- |
E |
E |
E |
E |
E |
E |
- |
- |
- |
- |
- |
- |
- |
A |
- |
I |
|
布尔对象 ( B ) |
A |
- |
- |
A |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
@ |
I |
|
字节对象 ( Y ) |
A |
I |
- |
- |
A |
A |
- |
A |
A |
A |
A |
- |
A |
- |
A |
A |
A |
A |
@ |
I |
|
短整型对象 ( S ) |
A |
I |
- |
- |
- |
A |
- |
A |
A |
A |
A |
- |
- |
- |
A |
A |
A |
A |
@ |
I |
|
字符对象 ( C ) |
A |
- |
- |
- |
- |
- |
A |
A |
A |
A |
A |
- |
- |
- |
A |
A |
A |
A |
@ |
I |
|
整型对象 ( I ) |
A |
- |
- |
- |
- |
- |
- |
A |
A |
A |
A |
- |
- |
- |
- |
A |
A |
A |
@ |
I |
|
长整型对象 ( J ) |
A |
- |
- |
- |
- |
- |
- |
- |
A |
A |
A |
- |
- |
- |
- |
- |
A |
A |
@ |
I |
|
浮点对象 ( F ) |
A |
- |
- |
- |
- |
- |
- |
- |
- |
A |
A |
- |
- |
- |
- |
- |
- |
A |
@ |
I |
|
双精度浮点对象 ( D ) |
A |
- |
- |
- |
- |
- |
- |
- |
- |
- |
A |
- |
- |
- |
- |
- |
- |
- |
@ |
I |
|
引用 ( R ) |
I |
@ |
@ |
- |
- |
- |
- |
- |
- |
- |
- |
@ |
@ |
@ |
@ |
@ |
@ |
@ |
@ |
@ |
I |
def
类型
O |
N |
T |
b |
y |
s |
c |
i |
j |
f |
d |
B |
Y |
S |
C |
I |
J |
F |
D |
R |
|
def 作为字符串 |
I |
- |
I |
- |
- |
- |
E |
- |
- |
- |
- |
- |
- |
- |
E |
- |
- |
- |
- |
@ |
def 作为布尔值/Boolean |
I |
- |
- |
I |
- |
- |
- |
- |
- |
- |
- |
I |
- |
- |
- |
- |
- |
- |
- |
@ |
def 作为字节/Byte |
I |
- |
- |
- |
I |
I |
E |
I |
I |
I |
I |
- |
I |
I |
E |
I |
I |
I |
I |
@ |
def 作为短整型/Short |
I |
- |
- |
- |
E |
I |
E |
I |
I |
I |
I |
- |
E |
I |
E |
I |
I |
I |
I |
@ |
def 作为字符/Character |
I |
- |
- |
- |
E |
E |
I |
I |
I |
I |
I |
- |
E |
E |
I |
I |
I |
I |
I |
@ |
def 作为整型/Integer |
I |
- |
- |
- |
E |
E |
E |
I |
I |
I |
I |
- |
E |
E |
E |
I |
I |
I |
I |
@ |
def 作为长整型/Long |
I |
- |
- |
- |
E |
E |
E |
E |
I |
I |
I |
- |
E |
E |
E |
E |
I |
I |
I |
@ |
def 作为浮点数/Float |
I |
- |
- |
- |
E |
E |
E |
E |
E |
I |
I |
- |
E |
E |
E |
E |
E |
I |
I |
@ |
def 作为双精度浮点数/Double |
I |
- |
- |
- |
E |
E |
E |
E |
E |
E |
I |
- |
E |
E |
E |
E |
E |
E |
I |
@ |
def 作为引用 |
@ |
@ |
@ |
- |
- |
- |
- |
- |
- |
- |
- |
@ |
@ |
@ |
@ |
@ |
@ |
@ |
@ |
@ |