表达式的类型
i -1是
int因为整数算术表达式中的所有操作数都至少扩展为
int。
Set<Short>有
add(Short),
remove(Object)因此
remove通话中不需要强制转换/自动装箱。因此,您正在尝试
Integer从的集合中删除
Short。
请注意,由于这个原因,几乎没有必要声明
Set<Number>:
final Set<Number> 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]
作为奖励回合,如果将set实现更改为
TreeSet,则魔术消失,并且抛出a
ClassCastException,从而放弃了把戏。
从深处看,这个问题与平等是对称关系这一事实有关,它不能区分右手侧和左手侧。使用Java的单调度方法无法实现这些语义。



