【问题标题】:Cast Regular Int to Final Java [duplicate]将常规 Int 转换为最终 Java [重复]
【发布时间】:2014-04-18 16:06:41
【问题描述】:

我正在尝试在循环中实现一个内部类,并且遇到了一个有趣的情况。内部类有方法,但是,当我尝试访问变量时,Netbeans 给我一个编译器错误并告诉我将 int 设为 final。

由于int是一个循环变量,它不能是final的。我尝试创建新变量并将它们等同于循环变量,但这仍然会引发相同的错误。

这是基本语法(伪代码):

for(int i = 0; i < 10; i++)
{
     panels[i].printI(new printI(){System.out.println(i);});
}

有什么想法吗?

【问题讨论】:

  • 你不能在循环的第一行使用final int j = i;,然后将j传递给System.out.println吗?
  • 但是,如果我这样做,那么循环将无法增加 j,因为值会被锁定?
  • 确实如此。请参阅 qqilihq 的回答。
  • 感谢您的回复。但是为什么内部类不能访问超出其范围的局部变量呢?

标签: java inner-classes


【解决方案1】:

添加一个临时的final 变量来保存值:

for(int i = 0; i < 10; i++)
{
     final int tmp = i;
     panels[i].printI(new printI(){System.out.println(tmp);});
}

【讨论】:

  • 这个答案提供了一个很好的解决方案,对我有帮助。感谢您发帖。
【解决方案2】:

这是成语:

for(int i = 0; i < 10; i++)
{
  final int j = i;
  panels[i].printI(new printI(){System.out.println(j);});
}

【讨论】:

    【解决方案3】:

    或者使用数组变体,这样可以节省你一行代码;)

    for(final int[] i = {0}; i[0] < 10; i[0]++)
    {
         panels[i[0]].printI(new printI(){System.out.println(i[0]);});
    }
    

    【讨论】:

    • oooo 我喜欢那个。提供可变性,而不会造成任何性能损失或包装对象的复杂性。
    猜你喜欢
    • 2011-02-02
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 2012-08-22
    相关资源
    最近更新 更多