Java - short and casting

后端 未结 3 2020
眼角桃花
眼角桃花 2020-12-06 01:53

I have the following code snippet.

public static void main(String[] args) {
 short a = 4;
 short b = 5;
 short c = 5 + 4;
 short d = a;
 short e = a + b; //          


        
3条回答
  •  离开以前
    2020-12-06 02:34

    These are the relevant JLS sections:

    JLS 5.1.1 Identity Conversion

    A conversion from a type to that same type is permitted for any type.

    JLS 5.2 Assignment Conversion

    Assignment conversion occurs when the value of an expression is assigned to a variable: the type of the expression must be converted to the type of the variable. Assignment contexts allow the use of one of the following:

    • Identity conversion
    • [...]

    In addition, if the expression is a constant expression of type byte, short, char or int :

    • A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, and the value of the constant expression is representable in the type of the variable.

    The above rules explain all of the following:

    short a = 4;     // representable constant
    short b = 5;     // representable constant
    short c = 5 + 4; // representable constant
    short d = a;     // identity conversion
    short e = a + b; // DOES NOT COMPILE! Result of addition is int
    
    short z  = 32767; // representable constant
    short z_ = 32768; // DOES NOT COMPILE! Unrepresentable constant
    

    As to why this doesn't compile:

    test(7); // DOES NOT COMPILE! There's no test(int) method!
    

    It's because the narrowing conversion with constant is only defined for assignments; not for method invocation, which has entirely different rules.

    JLS 5.3. Method Invocation Conversion

    Method invocation conversions specifically do not include the implicit narrowing of integer constants which is part of assignment conversion. The designers of the Java programming language felt that including these implicit narrowing conversions would add additional complexity to the overloaded method matching resolution process.

    Instead of explaining how method resolution works precisely, I will just quote Effective Java 2nd Edition, Item 41: Use overloading judiciously:

    The rules that determine which overloading is selected are extremely complex. They take up thirty-three pages in the language specification, and few programmers understand all of their subtleties.


    See also

    • Varying behavior for possible loss of precision
      • short x = 3; x += 4.6; compiles because of semantics of compound assignment

提交回复
热议问题