2

コンパイラが値 '7' を 'short' にキャストできない理由を知っている人はいますか? 明示的なキャストは機能していますが、パラメーターを渡している間は機能していません!!!

class Alien {
    String invade(short ships) { return "a few"; }
    String invade(short... ships) { return "many"; }
}
public class Wind {
    public static void main(String [] args) {
        short temp = 7;
        System.out.println(new Alien().invade(7));
    }
}
4

6 に答える 6

5

整数リテラル(ここで話していること) は、代わりに値intであることを示すサフィックスがない限り、値です。long

仕様のセクション 3.10.1から:

整数リテラルは、ASCII 文字の L または l (エル) の接尾辞が付いている場合、long 型です。それ以外の場合は int 型です (§4.2.1)。

でもキャスティングはうまい。リテラルではない定数を持つことも完全に可能です。例えば:

public static final short THIS_IS_A_SHORT = 7;

これはtypeTHIS_IS_A_SHORTの定数ですshort。この場合、代入であるため、キャストは必要ありません。割り当ては、以下を含むJLS セクション 5.2の対象となります。

変数の型が byte、short、または char であり、定数式の値が変数の型で表現できる場合は、縮小プリミティブ変換を使用できます。

メソッドの引数は代入変換の対象ではありません。

于 2013-01-10T18:07:24.533 に答える
1

Java では、デフォルトで整数リテラルは int プリミティブ型として扱われます。

invade(7)type のパラメータを持つメソッド invade を探しますint

于 2013-01-10T18:06:13.967 に答える
1

整数値の定数はint型定数であるためです。したがって7、それ自体はint定数です。

UPD: Java が呼び出すメソッドを検索するとき、ある種のメソッド プロトタイプを検索します。あなたの場合はそうでありinvade(int)、そのような引数の型を持つメソッドはありません。invade(short)とのみinvade(short...)

新しい変数を作成すると、つまりJava はそれが短い値であるshort temp = 7;ことを「認識」し、キャストせずに代入を許可します。7

于 2013-01-10T18:07:00.713 に答える
0

JAVAは、短いリテラルを持たないように意図的に作成されています。

Javaにバイトリテラルまたはショートリテラルがないのはなぜですか?

http://www.velocityreviews.com/forums/t149350-java-byte-literals-and-short-literals.html


7はintリテラルですが、リテラルとして直接使用することはできませんshort。あなたはこれが必要です:

System.out.println(new Alien().invade((short) 7));
于 2013-01-10T18:14:38.953 に答える
0

Javaは整数リテラルをintとして扱い、そのような引数を持つメソッドはありません。一方、Java は自動ダウン キャストを実行していません。これは、データの損失やフラグ エラーの原因となる可能性があるためです。

以下の変更を行う場合。メソッドの呼び出し中に短いパスを渡していますが、アップ キャストに害はありません。Java がそれを行います。「少数」の出力を生成する

class Alien {
    String invade(int ships) { return "a few"; }
     String invade(int... ships) { return "many"; }
 }
 public class Wind {
    public static void main(String [] args) {
       short temp = 7;
      System.out.println(new Alien().invade(temp));
  }
}
于 2013-01-10T18:11:36.947 に答える
0
class Alien {
String invade(short ships) { return "a few"; }
String invade(short... ships) { return "many"; }
}


public class Wind {
public static void main(String [] args) {
    short temp = 7; // the variable temp get a value of 7
    System.out.println(new Alien().invade(temp)); // but 7 is not short by default, 
                                                  // so use variable temp instead of 7
    }
}
于 2013-05-04T19:27:19.607 に答える