gembin

          OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

          HBase, Hadoop, ZooKeeper, Cassandra

          Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

          There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

          About Me

           

          Why int can't be passed to wrapper type Byte constructor?

          Let's take a look at the following code:

          class Program {
          public static void main (String[] args) {
          byte a = 1;
          Byte b = new Byte(primitiveByte);
          Byte c = new Byte(1);
          Byte d = new Byte((byte)1);
          System.out.print(b.byteValue() + c.byteValue());
          }
          }

          Why does the line "byte a = 1;" compile without error? and Why does the "Byte c = new Byte(1);" has a compile-time error?. Both of them use the integer literal value 1 within the range of byte. So why explicit casting "(byte)1" is needed?

          The assignment conversion (such as "byte a = 1;") is different than the method invocation conversion (such as "Byte c = new Byte(1);").  They are two subsections in Java Language Specification 3rd Edition:

          • 5.2 Assignment Conversion : Assignment conversion converts the type of an expression to the type of a specified variable.
          • 5.3 Method Invocation Conversion : Method invocation conversion is applied to each argument in a method or constructor invocation and, except in one case, performs the same conversions that assignment conversion does.

          Assignment Conversion

          Please read the above link for the detail about Assignment Conversion in Java. For our example:

          byte a = 1; 

          The assignment will not generate the compiler error because at any time if an integral value is assigned to any of the primitive types (byte, char, short), and the right hand side value is within the range of the left hand side data type, it will not generate an error. Hence as 1 is within the range of byte (-128 to 127), it is not generating compiler error. For example:

          byte a = 129; //Compile-time error

          When you assign an intergal value to any primitive type variable, the compiler will do a range checking to see if this value is in the range of the left side data type. If it is NOT within the range of data type, a compile-time error occurs.

          If the righ-hand of assignment is a variable or expression, can narrowing primitive conversions still work (5.1.3 Narrowing Primitive Conversions in Java Language Specification 3rd Edition)?

          • If the variable is a compile-time constant and the constants value is within the range of the left side data type, then it can be assigned to a narrower primitive type. Otherwise, a compiler error will occurs.
          • If the expression is a compile-time constant expression and the evaluated value is within the range of the left side data type, then it can be assigned to a narrower primitive type. Otherwise, a compiler time error will occurs.

          For example:

          int i1=1;
          final int i2 = 127;
          final int i3 = 245;
          byte b1 = i1; //Compile-time error, not final variable
          byte b2 = i2; //OK, compile time constant
          byte b3 = i3; //Compile-time error, over range
          byte b4 = (i2 + 2); //OK, compile time constant expression
          byte b5 = (i1 + 2); //Compile-time error, not final variable

          Method Invocation Conversion

          Please read the above link for the detail about the Method Invocation Conversion in Java. For our example:

          Byte c = new Byte(1);

          A compile-time error will occurs because you are passing an integer to the constructor of the Wrapper class Byte, the compiler will not do the implicit casting here.

          The 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.

          posted on 2010-07-08 15:11 gembin 閱讀(436) 評論(0)  編輯  收藏 所屬分類: JavaSE

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(6)

          隨筆分類(440)

          隨筆檔案(378)

          文章檔案(6)

          新聞檔案(1)

          相冊

          收藏夾(9)

          Adobe

          Android

          AS3

          Blog-Links

          Build

          Design Pattern

          Eclipse

          Favorite Links

          Flickr

          Game Dev

          HBase

          Identity Management

          IT resources

          JEE

          Language

          OpenID

          OSGi

          SOA

          Version Control

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          free counters
          主站蜘蛛池模板: 东海县| 同心县| 封丘县| 页游| 敖汉旗| 阆中市| 新民市| 桂林市| 桃园县| 北宁市| 灌云县| 溧阳市| 偏关县| 平阴县| 日照市| 新田县| 兴业县| 尉氏县| 青田县| 海淀区| 贞丰县| 蒲城县| 平邑县| 托克托县| 台北县| 遂溪县| 泽普县| 团风县| 漠河县| 宜宾县| 中超| 郸城县| 辽宁省| 义马市| 双流县| 兴安县| 阆中市| 大渡口区| 工布江达县| 闸北区| 平和县|