3

私はこの投稿を見ましたJava instanceiate Short object in Javaが、探しているものに正確に応答しませんでした。

最初の行(//1)でエラーが発生し、2行目(//2)ではエラーが発生しない理由を誰かが知っていますか

  Short s = new Short(4);//1

    short s1 = 4;//2 Here I know why it works it gets
 //implicitly narrow converted into a short. 

コードに書かれているように、2 行目は問題なく動作する理由は理解できましたが、1 行目はどうでしょうか。書く意味はどこにありShort s = new Short((short)4); ますか? 結論: 暗黙のうちにキャストしないのはなぜですか? 変数ではなく定数です。

前もって感謝します。

4

5 に答える 5

3

「short」を使用するコンストラクターと「int」を使用する別のコンストラクターを定義すると、言語のセマンティクスにより、コンストラクターへの呼び出しがあいまいになります。したがって、厳密なタイプを使用する必要があります。また、Short は final であるため、不必要なオブジェクトの割り当てを避けるために、Short.valueOf((short) 4) を使用してみてください。

于 2013-03-05T18:20:47.977 に答える
2

あなたが言う時

Short s = new Short(4);

4短いリテラルではなく整数リテラルを指定していますが、これはMethod Invocation Conversion の Java 言語仕様では許可されていません。

しかし、あなたが言うとき

short s1 = 4;

これは、Java 言語仕様でNarrowing Primitive Conversionと呼ばれるものの対象となり、精度が失われる場合でも許可されます。

于 2013-03-05T18:21:35.717 に答える
2

これは、Java が "検索メカニズム" を使用して int 型のコンストラクターを見つけるために発生します。変数に値を代入すると、その型が定義され、コンパイラはコードを最適化できます。コンストラクター (またはその他のメソッド) では、これは不可能です。

于 2013-03-05T18:17:20.400 に答える
1

あなたは以下のようにすべきです:

 Short s = new Short((short) 4);

理由:タイプ4はInteger / intであり、Shortではありません。したがって、Shortコンストラクターが互換性のある型をとるようにするには、明示的な型キャストを行う必要があります。

于 2013-03-05T18:19:16.630 に答える
0

サポートされていないだけです。

他の数値オブジェクトタイプでは、値のリテラルがあり、数値はデフォルトでintですが、長い間、L接尾辞があり、doubleにはdがあります。

新しいShort(int)で例外をスローする場合、コンストラクターは他の数値コンストラクターと矛盾します。

大きすぎる短いプリミティブを作成しようとすると、コンパイル時にテストされます。これはバイトの場合と同じです。

これを行った場合:

byte b = 1000000;

コードは例外をスローするのではなく、コンパイルされません。

したがって、コンパイラを考慮に入れると、動作は一貫しています。

于 2013-03-05T18:20:03.530 に答える