3

この質問をする方法がわかりませんでした。しかし、これら2行のコードの違いは何ですか?

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です

4

3 に答える 3

11

式のタイプは、整数算術式のすべてのオペランドが少なくともに拡張されるためi - 1です。持っているので、通話にキャスト/オートボクシングは必要ありません。したがって、sのセットからsを削除しようとしています。intintSet<Short>add(Short)remove(Object)removeIntegerShort

このため、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のシングルディスパッチメソッドでは実現できません。

于 2012-11-13T18:02:33.437 に答える
3

最初のコードスニペットは、最後の番号であるためを除いてHashSet、すべての番号から削除されます。Integers9998

Integer2番目のコードスニペットは、のからHashSetを削除しようとしているためShorts、要素は削除されません。

最初のコードスニペットでは、ステートメントadd(i)で、intが自動的にに変換されますInteger

2番目のコードスニペットで、次のことを行った場合:

Set<Short> a = new HashSet<Short>();
for (Short i = 0; i < 100; i++) {
     a.add(i);
     a.remove(i);
}

を追加および削除するため、すべての要素が削除されますShort。ただし、を削除しようとしているためi - 1、に変換i - 1されますIntegerIntegerしたがって、のHashSetからを削除しようとするとShorts、実際には番号が削除されません。

于 2012-11-13T18:02:38.860 に答える
2

キャストせずにショートパンツのセットから整数を削除することはできません。

于 2012-11-13T18:03:49.283 に答える