-
Enhancement
-
Resolution: Duplicate
-
P4
-
None
-
6
-
x86
-
windows_xp
FULL PRODUCT VERSION :
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode, sharing)
java version "1.5.0_13"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_13-b05)
Java HotSpot(TM) Client VM (build 1.5.0_13-b05, mixed mode, sharing)
A DESCRIPTION OF THE PROBLEM :
javac forbids compound assignment if lhs is of type Byte, Short, Character. However, it allows compound assignment for other wrappers and increment/decrement for all wrappers.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
compile attached source code
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
no compilation errors
ACTUAL -
Main.java:10: inconvertible types
found : int
required: java.lang.Byte
v += 1; // should be ok
^
Main.java:23: inconvertible types
found : int
required: java.lang.Short
v += 1; // should be ok
^
Main.java:36: inconvertible types
found : int
required: java.lang.Character
v += 1; // should be ok
^
3 errors
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
public class Main {
public void assignop_byte(byte v) {
v += 1;
}
public void inc_byte(byte v) {
++v;
}
public void assignop_Byte(Byte v) {
v += 1; // should be ok
}
public void inc_Byte(Byte v) {
++v;
}
public void assignop_short(short v) {
v += 1;
}
public void inc_short(short v) {
++v;
}
public void assignop_Short(Short v) {
v += 1; // should be ok
}
public void inc_Short(Short v) {
++v;
}
public void assignop_char(char v) {
v += 1;
}
public void inc_char(char v) {
++v;
}
public void assignop_Character(Character v) {
v += 1; // should be ok
}
public void inc_Character(Character v) {
++v;
}
public void assignop_int(int v) {
v += 1;
}
public void inc_int(int v) {
++v;
}
public void assignop_Integer(Integer v) {
v += 1;
}
public void inc_Integer(Integer v) {
++v;
}
public void assignop_long(long v) {
v += 1;
}
public void inc_long(long v) {
++v;
}
public void assignop_Long(Long v) {
v += 1;
}
public void inc_Long(Long v) {
++v;
}
public void assignop_float(float v) {
v += 1;
}
public void inc_float(float v) {
++v;
}
public void assignop_Float(Float v) {
v += 1;
}
public void inc_Float(Float v) {
++v;
}
public void assignop_double(double v) {
v += 1;
}
public void inc_double(double v) {
++v;
}
public void assignop_Double(Double v) {
v += 1;
}
public void inc_Double(Double v) {
++v;
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
do not use compound assignment for specifed wrapper types
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode, sharing)
java version "1.5.0_13"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_13-b05)
Java HotSpot(TM) Client VM (build 1.5.0_13-b05, mixed mode, sharing)
A DESCRIPTION OF THE PROBLEM :
javac forbids compound assignment if lhs is of type Byte, Short, Character. However, it allows compound assignment for other wrappers and increment/decrement for all wrappers.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
compile attached source code
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
no compilation errors
ACTUAL -
Main.java:10: inconvertible types
found : int
required: java.lang.Byte
v += 1; // should be ok
^
Main.java:23: inconvertible types
found : int
required: java.lang.Short
v += 1; // should be ok
^
Main.java:36: inconvertible types
found : int
required: java.lang.Character
v += 1; // should be ok
^
3 errors
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
public class Main {
public void assignop_byte(byte v) {
v += 1;
}
public void inc_byte(byte v) {
++v;
}
public void assignop_Byte(Byte v) {
v += 1; // should be ok
}
public void inc_Byte(Byte v) {
++v;
}
public void assignop_short(short v) {
v += 1;
}
public void inc_short(short v) {
++v;
}
public void assignop_Short(Short v) {
v += 1; // should be ok
}
public void inc_Short(Short v) {
++v;
}
public void assignop_char(char v) {
v += 1;
}
public void inc_char(char v) {
++v;
}
public void assignop_Character(Character v) {
v += 1; // should be ok
}
public void inc_Character(Character v) {
++v;
}
public void assignop_int(int v) {
v += 1;
}
public void inc_int(int v) {
++v;
}
public void assignop_Integer(Integer v) {
v += 1;
}
public void inc_Integer(Integer v) {
++v;
}
public void assignop_long(long v) {
v += 1;
}
public void inc_long(long v) {
++v;
}
public void assignop_Long(Long v) {
v += 1;
}
public void inc_Long(Long v) {
++v;
}
public void assignop_float(float v) {
v += 1;
}
public void inc_float(float v) {
++v;
}
public void assignop_Float(Float v) {
v += 1;
}
public void inc_Float(Float v) {
++v;
}
public void assignop_double(double v) {
v += 1;
}
public void inc_double(double v) {
++v;
}
public void assignop_Double(Double v) {
v += 1;
}
public void inc_Double(Double v) {
++v;
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
do not use compound assignment for specifed wrapper types
- duplicates
-
JDK-5009476 Compound assignments don't work well with Byte, Short
- Open