我不确定如何问这个问题。但是,这两行代码有什么不同呢?
Set<Integer> a = new HashSet<Integer>();
for (int i = 0; i < 100; i++) {
a.add(i);
a.remove(i - 1);
}
System.out.println(a.size());
我预计 99 是输出
输出为1
Set<Short> a = new HashSet<Short>();
for (Short i = 0; i < 100; i++) {
a.add(i);
a.remove(i - 1);
}
System.out.println(a.size());
我预计 99 是输出
输出为100
最佳答案
表达式的类型 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]
作为奖励回合,如果您将集合实现更改为 TreeSet
, 魔法消失并抛出一个 ClassCastException
, 给出了诀窍。
从根本上说,这个问题与相等是一种对称关系这一事实有关,它不能区分右手边和左手边。这些语义不可能用 Java 的单分派(dispatch)方法实现。
关于Java:在 Set 中添加/删除短整型元素时输出不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13366060/