11

さまざまなビジネス上の理由から、クラスの 1 つでいくつかの静的 ID を保持したいと考えています。それらはもともとありましたが、それらを同等にすることができるようにint変更したかったのです(つまり、NPEを回避します)IntegerMY_ID.equals(..)

それらを整数に変更すると、switch ステートメントでエラーが発生します。ドキュメントによると、スイッチ内では整数は問題ないはずです。

引用する

[Switch] は、列挙型 (列挙型で説明)、String クラス、および特定のプリミティブ型をラップするいくつかの特別なクラス (Character、Byte、Short、および Integer (数値と文字列で説明)) でも機能します。

以下の私のコードでは、 i が a のint場合、コンパイルされます。それがである場合、それはIntegerそれを言っていませんconstant expression is required。私はやってみ.intValue()ましたが、これもうまくいきません。

私は本当に愚かですか?または、ドキュメントを完全に読み違えていますか?

private static final Integer i = 1;

@Test
public void test() {
    switch(mObj.getId()){
        case i: //do something
        default: //do something default
    }

}

ここでのポインタに感謝します。当分の間、私はそれらを維持してintやっていますnew Integer(myint).equals(...)

4

6 に答える 6

10

定数をプリミティブ型に変更します。

private static final int i = 1;

あなたは大丈夫です。switchプリミティブ、列挙値、および (Java 7 以降) 文字列でのみ機能します。いくつかのヒント:

  • new Integer(myint).equals(...)余計かもしれません。変数の少なくとも 1 つがプリミティブである場合は、次のようにしますmyint == ...。ラッパーequals()と比較する場合にのみ必要です。Integer

  • Integer.valueOf(myInt)-の代わりに優先new Integer(myInt)し、可能な限りオートボクシングに依存します。

  • 定数は通常、Java では大文字を使用して記述されるため、static final int I = 1.

于 2012-09-26T14:22:00.917 に答える
3

Switchには、ステートメントまたは列挙型定数で定数式が必要です。定数式は次のとおりです。case

プリミティブ型の値を表す式、または突然完了しない文字列

したがって、整数は資格がありません。あなたの場合、intまたは列挙型を使用できます(コンパイル時にIDがわかっている場合は意味があります)。

ボックス化された型 (整数など) を使用できる唯一の場所は、switch 式です。

switch(Integer.valueOf(1)) {
    case 1: //
}
于 2012-09-26T14:22:51.490 に答える
3

Java が列挙型を提供するようになったので、通常は次のようにします。

public enum MyKey {
   i,
   j
}

...

switch(mObj.getId()){
    case i: //do something
    default: //do something default
}
于 2012-09-26T14:28:13.827 に答える
1

これ見てたから…

受け入れられた答えは次のように述べています:

スイッチは、プリミティブ、列挙値、および (Java 7 以降) 文字列でのみ機能します

でも、

14.11 switch ステートメント

以下を示す switch の JavaSE7 ドキュメントの概要を示します。

Expression の型は、char、byte、short、int、Character、Byte、Short、Integer、String、または列挙型 (§8.9) でなければなりません。そうしないと、コンパイル時エラーが発生します。

将来のサーファーのために明確にしたかっただけです。

于 2016-01-26T18:13:37.823 に答える
0

switch ステートメントでは定数値を使用する必要があります。

switch(mObj.getId()){
    case 5: //do something
    default: //do something default
}
于 2012-09-26T14:27:43.687 に答える
0

示されているコードでは、'i' はオブジェクト ポインターであり、定数式ではありません。

于 2012-09-26T14:28:11.253 に答える