Java:在Set中添加/删除short和integer元素时的不同输出 [英] Java: Different outputs when add/remove short and integer elements in a Set

查看:785
本文介绍了Java:在Set中添加/删除short和integer元素时的不同输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不确定如何提出这个问题。但是,这两行代码有什么不同?

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

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 设置<短> 添加(短)删除(对象)所以删除调用不需要进行转换/自动装箱。因此,您试图从一组中删除​​ Integer

The type of the expression i - 1 is int because all operands in an integer arithmetic expression are widened to at least int. Set<Short> 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.

请注意,由于这个原因,宣布 Set< Number> 几乎没有意义:

Note that for this reason it almost never makes sense to declare a 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 ,放弃了这个技巧。

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

在内心深处,这个问题与等式是对称关系这一事实有关,这种关系不能区分右手边和左手边。使用Java的单调度方法无法实现这些语义。

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.

这篇关于Java:在Set中添加/删除short和integer元素时的不同输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆