为什么我不能像这样在Java中懒惰地初始化静态长整型数组?

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}; 

是的,对不起。我检查了大部分的建议并且自己也进行了搜索,但是没有看到那一个。 - user1364534
可能会出现延迟初始化误导搜索。 - kosa
抱歉,我不是母语使用者,我有拼错吗?如果您能够的话,请随意更改标题或删除问题。 - user1364534
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设计团队联系。


3
首先,在您的静态初始化块(或字段声明)中有一个拼写错误。其次,您需要执行以下操作:
static {
        reservedFromIps = new long[]{0l, 167772160l, 1681915904l, 
            2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l, 
            3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l}; 
}

数组常量只能在初始化器中使用,不能在重新分配数组时使用。


打字错误是我懒惰初始化的结果,一开始我想写一个例子,然后改变了主意并复制粘贴了剩下的部分。顺便说一句,你的答案有效。 - user1364534
是的,我想错别字可能来自那样的地方 :-P 无论如何,很高兴我能帮忙! - arshajii

1

Java编译器无法解析您的速记表达式的类型。语法要求在表达式之前加上类型标识符,无论该表达式的类型是什么。只有原始类型和字符串才例外。数组不是原始类型。

当用作初始化程序时,初始化程序表达式类型已知 - 与初始化的变量类型相同。


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的声明和初始化在同一语句中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接