3

誰かがこの結果を説明できますか?

これは私のコードです:

public class foo <T> {

    public static void main(String[] args) {

        foo Foo = new foo();
        System.out.println(Foo.compare(100L, 100));
        System.out.println(Foo.compare(100L, 100L));
        System.out.println(Foo.compare(127L, 127L));
        System.out.println(Foo.compare(128L, 128L));

        System.out.println();
        System.out.println(System.getProperty("java.vendor"));
        System.out.println(System.getProperty("java.version"));

    }

    public boolean compare( T val1, T val2) {
        return ( val1 == val2 ) ? true : false;
    }

}

結果は次のとおりです。

false
true
true
false


Sun Microsystems Inc.
1.6.0_26

初めに:

テンプレートクラス "T" を 1 つしか宣言していないのが不思議です。val1 が long で val2 が int であるため、最初の比較は false になります (デバッガーで確認しました)。しかし、そうすべきではありません.1つのテンプレートクラスのみを宣言しており、両方とも同じです。

第二に:

127 より大きいすべての「長い」大きな数値が等しくないのはなぜですか??

ありがとう!

4

3 に答える 3

3

比較関数では、値の代わりに参照を比較しています (== 演算子は、組み込み型でない限り、常に参照を比較します。この投稿を参照してくださいJava で == と equals() の違いは何ですか? )。

ジェネリックを使用しているため、組み込み型は Java クラス (Integer など) にパックされています。

したがって、一般に、このコードはすべて false を返しますが、この場合、2 番目と 3 番目の例では true でした。なぜなら、Java コンパイラは [-128, 127] の範囲の数値をキャッシュするためです。 .

于 2013-06-22T23:19:52.100 に答える
3

val1 が long で val2 が int であるため、最初の比較は false になります (デバッガーで確認しました)。しかし、そうすべきではありません。なぜなら、私はテンプレートクラスを 1 つだけ宣言し、両方に対して同じことを宣言したからです。

foo Foo = new foo();その代わりに使用しているのは、任意のオブジェクトをパラメーターと見なしているためです (foo<Long> Foo = new foo<Long>();コンパイル後、コンパイラーはすべての型パラメーター消去し、型パラメーターがバインドされている場合はそれぞれを最初のバインドに置き換え、型パラメーターがバインドされていない場合はObjectに置き換えます) foo

127 より大きいすべての「長い」大きな数値が等しくないのはなぜですか??

val1 == val2なぜなら、これらの変数が指すオブジェクトに含まれる値ではなく、行の変数の参照を比較しているためです。

さて、組み込みたい質問:

longより小さい数127とより大きい数-128が等しいのはなぜですか?

JLS5.1.7のため

ボックス化される値 p が true、false、\u0000 ~ \u007f の範囲のバイト、または char、または-128 ~ 127 (両端を含む) の int または short の数値である場合、r1 および r2 を次の結果とします。 p の任意の 2 つのボクシング変換。r1 == r2 の場合は常にそうです。

于 2013-06-22T23:21:31.180 に答える
2

T はプリミティブではなくオブジェクトであるため、等価チェックを実行するequals代わりに使用する必要があります。==

public static void main(String[] args) {

    foo Foo = new foo();
    System.out.println(Foo.compare(100L, 100));
    System.out.println(Foo.compare(100L, 100L));
    System.out.println(Foo.compare(127L, 127L));
    System.out.println(Foo.compare(128L, 128L));

    System.out.println();
    System.out.println(System.getProperty("java.vendor"));
    System.out.println(System.getProperty("java.version"));

}

public boolean compare( T val1, T val2) {
    return ( val1.equals(val2) ) ? true : false; // use equal instead
}

これにより、以下が得られます。

false
true
true
true

1 つ目falseは、その 2 つの入力の型が同じではないという事実によって引き起こされます。したがって、それらの違いを引き起こす基本的なキャストがあります。

于 2013-06-22T23:21:04.940 に答える