Java: Different outputs when add/remove short and integer elements in a Set

后端 未结 3 834
南笙
南笙 2020-12-07 03:55

I wasn\'t sure on how to ask this question. But, what is the different between these 2 lines of code?

Set a = new HashSet();
f         


        
3条回答
  •  半阙折子戏
    2020-12-07 04:19

    The type of the expression i - 1 is int because all operands in an integer arithmetic expression are widened to at least int. Set has add(Short) and remove(Object) so there's no casting/autoboxing needed on the remove call. Therefore you are trying to remove Integers from a set of Shorts.

    Note that for this reason it almost never makes sense to declare a Set:

    final Set ns = new HashSet<>();
    final short s = 1;
    ns.add(s);
    ns.add(s+0);
    ns.add(s+0L);
    System.out.println(ns); // prints [1, 1, 1]
    

    As a bonus round, if you change the set implementation to TreeSet, the magic disappears and it throws a ClassCastException, giving away the trick.

    Deep down, this issue has to do with the fact that equality is a symmetric relation, which must not distinguish the right hand side from the left hand side. These semantics are impossible to achieve with Java's single-dispatch methods.

提交回复
热议问题