4
private static final long[] reservedFromIps;

static {
    reservedFromIps = {0l, 167772160l, 1681915904l, 
        2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l, 
        3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l}; 
}

エラーは「ステートメントではなく式の不正な開始です。予期されます」

一方、以下は正常に動作します:

private static final long[] reservedFromIps = {0l, 167772160l, 1681915904l, 
    2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l, 
    3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l}; 
4

4 に答える 4

5

staticこれはブロックとは関係ありません。配列定数は初期化子でのみ使用できます。それは言語が指定されている方法です。
このコードは次のいずれもコンパイルされません。

public class Test {
    public static void main(String[] args) {
        long[] reservedFromIps;
        reservedFromIps = {0l, 167772160l, 1681915904l, 
                2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l, 
                3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l}; 
    }
}

なぜそうなるのかはおそらく、コンパイラの複雑さが増し、利益がほとんど得られないという問題ですが、完全に確認するには、Java 設計チームに相談する必要があります。

于 2012-09-18T21:33:23.210 に答える
3

まず、静的初期化ブロック (またはフィールド宣言) にタイプミスがあります。次に、これを行う必要があります。

static {
        reservedFromIps = new long[]{0l, 167772160l, 1681915904l, 
            2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l, 
            3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l}; 
}

配列定数は初期化子でのみ使用でき、配列を再割り当てするときは使用できません。

于 2012-09-18T21:32:42.057 に答える
1

Java コンパイラは、省略表現の型を解決できません。構文では、その式が何であれ、式の前に型識別子が必要です。例外は、プリミティブと文字列に対してのみ作成されます。配列はプリミティブではありません。

初期化子として使用する場合、初期化された変数の型と同じように、初期化子の式の型は既知です。

于 2012-09-18T21:39:35.703 に答える
0

配列型変数の宣言は、同じステートメントで初期化を行う必要があります。のようにlong[] reservedFromIps = { /* ... */}。これは、シンタックス シュガーによって必要とされます (これにより、 だけで配列を初期化できます{})。

たとえば、次のように動作するはずです-

static { 
    reservedFromIps = new long[] {0l, 167772160l, 1681915904l,  
    2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l,  
    3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l};  
}

その理由は以下

private static final long[] reservedFromIps = {0l, 167772160l, 1681915904l,  
    2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l,  
    3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l};  

その場合、配列の宣言と初期化がreservedFromIps同じステートメント内にあるためです。

于 2012-09-18T21:33:11.230 に答える