为什么我不能在java for-each循环中使用现有变量?

rec*_*urf 2 java foreach for-loop

我猜它不起作用,因为在语法中第一个参数必须具有声明的类型.但是,如果我在一个带有参数的函数中使用for-each循环,就像我在这个例子中那样呢?变量p有一个声明的类型,我只想重用它.

public void addItem(Product p) {
  // ensure that we don't add any nulls to the item list
  if (p != null ) {
    int i = 0;

    for (p : items.keySet()) {
      i++;
    }

    items.put( p , i);
  }
}
Run Code Online (Sandbox Code Playgroud)

有一个相关的问题,Java for循环语法:"for(T obj:objects)".那个询问for-each语法意味着什么.我知道这意味着什么,我只想重用一个现有的变量,而不是必须声明一个新变量.

Bat*_*eba 7

Java语言规范(JLS)要求您为迭代器声明一个局部变量.

即你需要

for (Product p : items.keySet()){

你不能从外部范围借款 p.摆脱困境的一种方法是使用类似的东西

for (Product inner_p : items.keySet()){`
    p = inner_p;
    /* continue as before*/
Run Code Online (Sandbox Code Playgroud)

但这会绕过JLS 的意图,因此将代码重构为更优雅的形式可能会更好.