Skip to main content

Why narrowing primitive conversions from primitive long requires explicit casting?

Converting a large primitive type to a smaller primitive type is called narrowing primitive conversion. There's a special case known as an assignment conversion that handles some conversion without explicit casting.
Let's take a look at the following code:
class Program {
  public static void main(String[] args) {
     final int iVar = 10;
     byte  bVar = iVar;
     fianl int iVar1 = 345;
     byte  bVar1 = iVar1; //Compile time error
  }
}
In this example, a variable of type byte is being assigned a value of a constant expression of type int. This implies a narrowing conversion. We know that the value of constant expression must be in the range of variable's type for the assignment conversion to happen. In our example, as long as the value of iVar is for -128 to 127, the narrowing conversion is used in the assignment conversion.
The following code does not compile, even with the value of constant expression is in the range of type byte:
class Program {
  public static void main(String[] args) {
     final long lVar = 10;
     byte bVar = lVar; //compile time error
  }
}
Why the assignment conversion doesn't work here? We have a constant expression and the value is representable for the type byte. Here is answer from JLS:

5.2 Assignment Conversion in Java Language Specification 3rd Edition:
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.
  • A narrowing primitive conversion followed by a boxing conversion may be used if the type of the variable is :
    • Byte and the value of the constant expression is representable in the type byte.
    • Short and the value of the constant expression is representable in the type short.
    • Character and the value of the constant expression is representable in the type char.
In the above example, the expression is a constant expression of type long and it is not covered by the special case. Therefore, a explicit cast must be used.
class Program {
  public static void main(String[] args) {
     final long lVar = 10;
     byte bVar = (byte)lVar;  
  }
}

Comments

  1. You might want to look at the += , -= , *= etc operations. These have implicity down casting as well.
    e.g.

    byte b = 5;
    b *= 2;
    System.out.println(b);

    Note: 5 and 2 are int types here, down cast to byte.

    However, consider this.

    byte b = 5;
    b *= 5.5;
    System.out.println(b);

    This prints 27. ;) i.e. its the same as
    b = (byte) ((int) 5 * (double) 5.5);

    ReplyDelete

Post a Comment

Popular posts from this blog

WebSphere MQ Interview Questions

What is MQ and what does it do? Ans. MQ stands for MESSAGE QUEUEING. WebSphere MQ allows application programs to use message queuing to participate in message-driven processing. Application programs can communicate across different platforms by using the appropriate message queuing software products. What is Message driven process? Ans . When messages arrive on a queue, they can automatically start an application using triggering. If necessary, the applications can be stopped when the message (or messages) have been processed. What are advantages of the MQ? Ans. 1. Integration. 2. Asynchrony 3. Assured Delivery 4. Scalability. How does it support the Integration? Ans. Because the MQ is independent of the Operating System you use i.e. it may be Windows, Solaris,AIX.It is independent of the protocol (i.e. TCP/IP, LU6.2, SNA, NetBIOS, UDP).It is not required that both the sender and receiver should be running on the same platform What is Asynchrony? Ans. With messag...

WebSphere MQ Interview Questions

What is MQ and what does it do? Ans. MQ stands for MESSAGE QUEUEING. WebSphere MQ allows application programs to use message queuing to participate in message-driven processing. Application programs can communicate across different platforms by using the appropriate message queuing software products. What is Message driven process? Ans . When messages arrive on a queue, they can automatically start an application using triggering . If necessary, the applications can be stopped when the message (or messages) have been processed. What are advantages of the MQ? Ans. 1. Integration. 2. Asynchrony 3. Assured Delivery 4. Scalability. How does it support the Integration? Ans . Because the MQ is independent of the Operating System you use i.e. it may be Windows, Solaris,AIX.It is independent of the protocol (i.e. TCP/IP, LU6.2, SNA, NetBIOS, UDP).It is not required that both the sender and receiver should be running on the same platform What is Asynchrony? Ans. With message queuing, the ex...

WebSphere MQ Series Tutorial

MQ Series : - It is an IBM web sphere product which is evolved in 1990’s. MQ series does transportation from one point to other. It is an EAI tool (Middle ware) VERSIONS :-5.0, 5.1, 5.3, 6.0, 7.0(new version). The currently using version is 6.2 Note : - MQ series supports more than 35+ operating systems. It is platform Independent. For every OS we have different MQ series software’s. But the functionality of MQ series Default path for installing MQ series is:- C: programfiles\IBM\Eclipse\SDK30 C: programfiles\IBM\WebsphereMQ After installation it will create a group and user. Some middleware technologies are Tibco, SAP XI. MQ series deals with two things, they are OBJECTS, SERVICES. In OBJECTS we have QUEUES CHANNELS PROCESS AUTHENTICATION QUERY MANAGER. In SERVICES we have LISTENERS. Objects : - objects are used to handle the transactions with the help of services. QUEUE MANAGER maint...