6
public void m1(Integer f) {
    ...
}

public void m1(Float f) {
    ...
}

public void main() {
    m1(null); // error: the method m1(Integer) is ambiguous for the type Main
    m1((Integer) null); // success
}

上記の例を考えると、いくつかの方法null入力されていることを認めることができます。では、なぜ次の行が出力されるのtrueでしょうか? 確かo1に、o2どちらにも値はありません (つまりnull) が、同じ型 ( Integervs Float) ではありません。最初falseは印刷されていると思っていました。

Integer i = null;
Object o1 = (Object) i;
Float f = null;
Object o2 = (Object) f;
System.out.println(o1 == o2); // prints true

// in short:
System.out.println(((Object) ((Integer) null)) == ((Object) ((Float) null))); // prints true
4

6 に答える 6

8

すべてのnull値は型指定されておらず、等しいです。異なる参照型に渡すことができますが、比較目的では違いはありません。

型付けされるのは値ではなく、null型付けできる null への参照です。

よくある質問は、ここで何が起こるかです

class A {
    public static void hello() { System.out.println("Hello World"); }

    public static void main(String... args) {
        A a = null;
        a.hello();
        System.out.println("a is an A is " + (a instanceof A)); // prints false.
    }
}

コンパイラはの型をaとして認識しA、静的メソッドが呼び出されます。しかし、参照される値は型指定されていませnullん。

NullPointerException を発生させずに実行できる唯一の操作nullは、それを調べたり別の参照と比較したりせずに代入または渡すことです。

ところで

つまり、コンパイラは参照のタイプに基づいてメソッドを選択します。実行時には、参照されるオブジェクトのクラスに基づいて実行されます。実行時nullに任意の型または型なしとして扱われるか、逆参照しようとすると NullPointerException が発生します。

于 2012-09-27T08:55:04.413 に答える
1

http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.1を参照してください

null「ヌルタイプ」に属します。「nullタイプ」の値は1つだけnullです。

null型は、すべての参照型のサブタイプです。したがって、私たちはできる

Integer i = null;   
(Integer)null

言い換えると、nullはすべての参照型で有効な値です。

(タイプを値のセットと考えてください。値のタイプはそれが属するセットです。「サブタイプ」は「サブセット」を意味します。)

于 2012-09-27T16:20:08.480 に答える
1

Java の「==」は、単に「等しいか」ではなく、同じインスタンスであるかどうかを確認します。Java には null の複数インスタンスという概念はありません。null と null を比較すると、型に関係なく常に true が返されます。

同じ名前のメソッドに引数として null を渡すことができず、パラメーターの型が異なる別のメソッドに渡すことができない理由は、どちらのメソッドも型のコンテキストがなくても呼び出される可能性があるためです。どちらであるかを推測するのではなく、エラーを正しく示します。

于 2012-09-27T08:55:47.313 に答える
0

上記の例を考えると、 null が型指定されていないことは認められます。 を呼び出すとm1(null)、コンパイラは実際のパラメーターの型を判断できず、呼び出すメソッドを決定できません。すべてのヌルは等しく、型付けされていません(null==null)==true

于 2012-09-27T08:57:03.760 に答える
0

あなたの例では、コンパイラが(nullの)型を識別できず、呼び出すメソッドを決定できないことが証明されています。したがって、型を明示的に指定する必要があります。またnull == null、常に true になります。どのようなキャストを行っても、変更されたり null 型が与えられたりすることはありません。

この投稿には に関する長い説明がありnullます。

于 2012-09-27T09:02:35.880 に答える
0

Null には型がありませんが、参照(nullまたはその他のもの) には型があります。型の異なる 2 つの参照変数を宣言できますが、nullそれらが参照するものはどちらの場合も同じです。

Integer a = null;
Double  b = null;

あなたの例では、

m1((Integer) null);

コンパイラは、値自体の型ではなく、渡された参照の型を使用して、どのオーバーロードされたメソッドを呼び出すかを決定します。null

于 2012-09-27T08:58:20.513 に答える