01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
package types.coercion;
class Main {
private Main() {}
@SuppressWarnings("cast")
public static void main(String[] args) {
int i0 = 1;
float f0 = i0; // compiles ok, runs ok (implicit up-coercion)
float f1 = (float) i0; // compiles ok, runs ok (explicit up-coercion)
float f2 = 1.42f;
// int i2 = f2; // compiler error (implicit down-coercion)
int i3 = (int) f2; // compiles ok, runs ok (explicit down-coercion)
// Note that coercion changes the actual value, not just the
// declared type.
float f3 = i3;
System.out.println("f2=" + f2);
System.out.println("f3=" + f3);
}
}
class CoercionOrdering {
private CoercionOrdering() {}
public static void showingCoercionOrder() {
// booleans and object types do not coerce
// use ?: to convert booleans to other types
// use ?: also for object types
boolean p = false;
int j = p ? 1 : 0;
Object o = null;
int k = (null==o) ? 0 : 1;
// char and short are both 16 bit, but mutually incomparable
char c = '\0';
short z = 0;
z = (short) c;
c = (char) z;
// number types from bottom to top
byte b = 0;
short s = b;
int i = s;
long l = i;
float f = l;
double d = f;
// number types from top to bottom, losing precision
f = (float) d;
l = (long) f;
i = (int) l;
s = (short) i;
b = (byte) s;
}
}
|