...
This noncompliant code example prints 100 as the size of the HashSet rather than the expected result (1). The combination of values of types short and int in the operation i-1 causes the result to be autoboxed into an object of type Integer, rather than one of type Short. The HashSet contains only values of type Short; the code attempts to remove objects of type Integer. Consequently, the remove() operation accomplishes nothing.
| Code Block | ||
|---|---|---|
| ||
import java.util.HashSet; 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(i - 1); // tries to remove an Integer } System.out.println(s.size()); } } |
...
Objects removed from a collection must share the type of the elements of the collection. Numeric promotion and autoboxing can produce unexpected object types. This compliant solution uses an explicit cast to short that matches the intended boxed type.
| Code Block | ||
|---|---|---|
| ||
import java.util.HashSet; 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)); // removes a Short } System.out.println(s.size()); } } |
...
Chapter 5 | |
[JLS 2005] | |
The Joy of Sets |
02. Expressions (EXP) EXP05-J. Do not write more than once to the same variable within an expression