分类: Java
2010-07-12 09:09:41
Hist:
100712, draft
A specific conversion from type S to type T allows an expression of type S to be treated at compile time as if it had type T instead. In some cases this will require a corresponding action at run time to check the validity of the conversion or to translate the run-time value of the expression into a form appropriate for new type T. For example,
1) a conversion from type Object to type Thread requires a run-time check.
2) a conversion from type Thread to type Object requires no run-time action.
The specific conversions in Java are grouped into several braod categories:
1) identity conversions
2) widening primitive conversions
3) narrowing primitive conversions
4) widening reference conversions
5) narrowing reference covnersions
6) boxing conversions
7) unboxing conversions
8) unchecked conversions
9) capture conversions
10) string conversions
11) value set conversions
There are 5 conversion contexts in which conversion of expressions may occur. The term ‘conversion’ is also used to describe the process of choosing a specific conversion for such a context:
1) assignment conversion
2) method invocation conversion
3) casting conversion
4) string conversion
5) numeric promotion
Identity Conversions
A conversion from a type to that same type is permitted for any type.
Widening Primitive Conversion
There are 19 widening primitive conversions:
1) byte to short, int, long, float, or double
2) short to int, long, float, or double
3) char to int, long, float, or double
4) int to long, float, or double
5) long to float or double
6) float to double
Narrowing Primitive Conversions
There are 22 narrowing primitive conversions:
1) short to byte or char
2) char to byte or short
3) int ot byte, short, or char
4) long to byte, short, char, or int
5) float to byte, short, char, int or long
6) double to byte, short, char, int, long, or float
Widening and Narrowing Primitive Conversions
byte ot char
First, the byte is converted to an int, and then to char.
Widening Reference Conversions
Convert from type S to type T, provided S is a subtype of T.
Widening reference conversions never required a special action at run time and never throw an exception at run time.
Narrowing Reference Conversions
1) from type S to type T, provided S is a proper supertype of T
2) from class type C to non-parameterized interface type K, provided that C is not final and does not implement K.
3) from interface type J to non-parameterized class type C that is not final.
4) from the interface types Cloneable and java.io.Serializable to any array type T[]
5) from any interface type J to any non-parameterized interface type K, provided J is not a subinterface of K.
6) from any array type SC[] to any array type TC[], provided there is a narrowing conversion from SC to TC.
Boxing Conversion
Boxing conversion converts values of primitive type to corresponding values of reference type:
1) from boolean to Boolean
2) from byte to Byte
3) from char to Character
4) from short to Short
5) from int to Integer
6) from long to Long
7) from float to Float
8) from double to Double
Unboxing Conversion
Unboxing conversion converts values of reference type to corresponding values of primitive type.
1) from Boolean to boolean
2) from Byte to byte
3) from Character to char
4) from Short to short
5) from Integer to int
6) from Long to long
7) from Float to float
8) from Double to double
Unchecked Conversion
Let G name a generic type declaration with
n formal type parameters. There is an unchecked conversion from the raw type G
to any parameterized type of the form G
Unchecked conversion is used to enable a smooth interoperation of legacy code, written before the introduction of generic types.
Capture Conversion (JLS 5.1.10)
Capture conversion is complex, and I try to explain it in other article. In one word, capture conversion is designed to make wildcards more useful.
String Conversions
Forbidden conversion
Any conversion that is not explicitly allowed is forbidden.
Value Set Conversion
Value set conversion is the process of mapping a floating-point value from one value set to another without changing its type.
Assignment Conversion
Allow the use of one of the following:
1) an identity conversion
2) a widening primitive conversion
3) a widening reference conversion
4) a boxing conversion optionally followed by a widening reference conversion
5) an unboxing conversion optionally followed by a widening primitive conversion.
If after the conversion listed above have been applied, the resulting type is a raw type, unchecked conversion may then be applied.
If the type of an expression can be converted to the type of a variable by assignment conversion, we say the expression is assignable to the variable, and the expression is assignment compatible with the type of the variable. If not, a ClassCastException is thrown.
Method Invocation Conversion
Method invocation conversion is applied to each argument value in a method or constructor invocation: the type of the argument expression must be converted to the type of the corresponding parameter. It allows the use of one of the following:
1) an identity conversion
2) a widening primitive conversion
3) a widening reference conversion
4) a boxing conversion optionally followed by widening reference conversion
5) an unboxing conversion optionally followed by a widening primitive conversion
String Conversion
String conversion applies only to the operands of the binary + operator when one of the argument is a String.
Casting Conversion
Casting conversion is applied to the operand of a cast operator: the type of the operand expression must be converted to the type explicitly named by the cast operator. Detail description in uncheck and check rules.
Numeric Promotions
1. JLS 3nd