已将int设置为final,但无法分配final int

时间:2014-04-15 05:43:48

标签: java android final

我是java和android的初学者。在我试图制作的应用程序中,我使用以下for循环:

for(int current = 0; current < cityDetailsArray.size(); current++) {
            row = new TableRow(this);

            OnClickListener rowClickListener = new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    showDetailsView(cityDetailsArray.get(current)); //error - Cannot refer to a non-final variable current inside an inner class defined in a different method
                }
            };

            row.setOnClickListener(rowClickListener);
                    //rest of the loop
}

正如评论中显示的那样,弹出错误,修复方法是将final添加到int current。我做了那个,然后在final int current行中弹出了这个错误:

The final local variable current cannot be assigned. It must be blank and not using a compound assignment

没有显示修复,但显然是删除final。我该怎么做才能解决这个问题?

5 个答案:

答案 0 :(得分:4)

唯一的选择是在for循环中声明另一个变量:

for(int current = 0; current < cityDetailsArray.size(); current++) {
            row = new TableRow(this);
            final int currentCopy = current;

            OnClickListener rowClickListener = new OnClickListener() {

                @Override
                public void onClick(View v) {
                    showDetailsView(cityDetailsArray.get(currentCopy)); 
                }
            };

            row.setOnClickListener(rowClickListener);
                    //rest of the loop
}

你当然不能使循环变量current final,因为你在循环本身的递增/递减部分递增它。另外,you can't use a non-final local variable inside an anonymous inner class。你可以让current成为一个实例变量,但这几乎是不可接受的。

因此,要在匿名类中使用current,您可以创建该变量的副本,并生成currentCopy final。因此,对于循环的每次迭代,您将创建一个与current具有相同值的新变量,这将满足您的目的。

答案 1 :(得分:4)

更好的选择是使用enhanced for loop,因此您不需要final int变量或int变量:

for (final CityDetail cityDetail : cityDetailsArray) {
    OnClickListener rowClickListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            showDetailsView(cityDetail);
        }
    };
    row.setOnClickListener(rowClickListener);
    //rest of the loop
}

请注意,当将数据从当前方法传递到anonymous class时,您需要使用final变量,因为匿名内部类不应该能够修改引用(如果是基元,则为on) ,它的价值)。

答案 2 :(得分:0)

试试这个..

    for(int current = 0; current < 50; current++) {

        final int value = current;

        row = new TableRow(this);

        OnClickListener rowClickListener = new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                showDetailsView(cityDetailsArray.get(value)); //error - Cannot refer to a non-final variable current inside an inner class defined in a different method
            }
        };

        row.setOnClickListener(rowClickListener);
    }

修改

你不能将自动增量设为最终,因此将其分配给另一个值然后你可以使用它

final仅涉及引用本身,而不是引用对象的内容

答案 3 :(得分:0)

您可以在侦听器中创建最终字段,并为其指定值current

答案 4 :(得分:-1)

将当前变量声明为全局..

int current = 0; //声明全局..

并且喜欢这样..

for(; current&lt; cityDetailsArray.size(); current ++){             row = new TableRow(this);

        OnClickListener rowClickListener = new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                showDetailsView(cityDetailsArray.get(current)); //error - Cannot refer to a non-final variable current inside an inner class defined in a different method
            }
        };

        row.setOnClickListener(rowClickListener);
                //rest of the loop

}