3

Stringオブジェクト参照があり、それを参照に割り当てるとします。Objectこれは暗黙的に実行されますwidening

Object o = "Hello World"

Stringこれで、 でメソッドを使用できなくなりましたofloat私の質問は、 aを anにキャストするとデータが失われる C++ のように、この型キャストのためにデータが失われることはありますかint?

明示的にキャストoバックするStringと、実際の にアクセスできますString

Javaには引数として型変数を持つメソッドがたくさんあるObjectので、この引数に任意の型のオブジェクト参照を渡すことができます。このオブジェクトを明示的に狭めることによって、元のオブジェクトに戻すことはできますか?

4

4 に答える 4

4

オブジェクトの場合は、参照をキャストするだけです。オブジェクト ( String) はそのまま残ります。

メソッド呼び出しに aを渡すときはString、単に参照を渡すだけです (戻り値に遭遇したときに発生します)。を使用して確認および再キャストできます

if (o instanceof String) {
   String s = (String)o;
}

その文字列を安全に使用します (これを頻繁に行う場合は、オブジェクト モデリングが正しくないことを示している可能性がありますが、それは別の問題です)。

フロート/整数についても話していることに注意してください。これらは参照ではなくJavaプリミティブであるため、上記とは異なります。プリミティブのキャストに関する議論については、こちらを参照してください。簡単に言えば、ここでデータが失われます。

于 2013-02-20T12:15:54.260 に答える
2

Object クラスのオブジェクトを返すメソッドがある場合、文字列を返すことができ、事実、任意の Java オブジェクトを返すことができます。何の目的もなく、単にキャストするだけでパフォーマンスに影響します (文字列の不変性により、さらに影響を受けます)。実際、Object にキャストしなくても、Object クラスのメソッドを作成できます。不変性の影響について詳しく知りたい場合は、はじめに – 不変の性質 – 比較を参照してください。

于 2013-02-20T12:24:09.173 に答える
1

あなたがStringオブジェクトを持っていると確信しているなら、あなたはそうすることができます。ただし、実行時にテストすることもできます。

Object o = "Hello there!";
if (o instanceof String) {
    String s = (String) o;
    System.out.println("String length: " + s.length());
} else {
    System.out.println("Something else: " + o.getClass().getName());
}

実際、予期しないを望まない場合は、テストを行うことをお勧めしますClassCastException

于 2013-02-20T12:20:53.120 に答える
1

String オブジェクト参照があり、それを Object 参照に割り当てるとします。これにより、暗黙的に拡大が実行されます。

いいえ。これは拡張を実行するのではなく、キャストを実行します

この型キャストのためにデータが失われることはありますか

いいえ。アップキャストに関係なく、オブジェクトは依然として文字列です。いつでもダウンキャストして String に戻すことができます。

ナローイングとワイドニングは、プリミティブ変換と参照変換に関して定義されます。
アップキャスティングとダウンキャスティング (使用したように) は、識別変換に関して定義されています。

于 2013-02-20T12:23:32.803 に答える