Wiki Markup |
---|
A boxing conversion converts the value of a primitive type to the corresponding value of the reference type, for instance, from {{int}} to the type {{Integer}} \[[JLS 05|AA. Java References#JLS 05]\]. It can be convenient in many cases where an object parameter is desired, such as with collection classes like {{Map}} and {{List}}. Another use case is to pass object references to methods, as opposed to primitive types that are always passed by value. The resulting wrapper types also help reduce clutter in code. |
...
Wiki Markup |
---|
This noncompliant code snippetexample prints {{100}} as the size of the {{HashSet}} while it is expected to print {{1}}. The combination of values of types {{short}} and {{int}} in the operation {{i-1}} leads to autoboxing of the result into an object of type {{Integer}}. (See [EXP08-J. Be aware of integer promotions in binary operators].) The {{HashSet}} contains only values of only one type {{Short}} whereas the code attempts to remove objects of the (different) type {{Integer}}. As a result, the remove operation is equivalent to a _No Operation_ (NOP). The compiler enforces type checking so that only {{Short}} values are inserted, however, a programmer is free to remove an object of any type without triggering any exceptions sincebecause {{Collections<E>.remove()}} takesaccepts aan parameterargument of type {{Object}} and not a parameter of type {{E}}. Such behavior can result in unintended object retention or memory leaks. \[[Techtalk 07|AA. Java References#Techtalk 07]\] |
...
Avoid mixing the different boxed integer types. To remedy the issue described in the noncompliant code, if If an arithmetic operation is going expected to produce a primitive type which will may be get autoboxed to the a wrong type, cast add explicit casts to the primitive type correctly before allowing the autoboxing to worktake over.
Code Block | ||
---|---|---|
| ||
public class ShortSet {
public static void main(String[] args) {
HashSet<Short> s = new HashSet<Short>();
for(short i=0; i<100;i++) {
s.add(i);
s.remove((short)(i-1)); //cast to short
}
System.out.println(s.size());
}
}
|
...