无法使用下划线重构方法作为lambdas的参数?

Dog*_*Dog 4 java lambda android intellij-idea java-8

我有一个类有一个方法(其中一半不使用他们的参数,因此将其命名为下划线),我只是切换到Java 8.现在我想用lambdas替换它们.

这是我的代码:

interface I {
  void stuffHappened(Integer howManyStuff);
}

public class A {
  void go() {
    I i = new I() {
      public void stuffHappened(Integer _) {
        System.out.println("woah!!");
      }
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

之后:

interface I {
  void stuffHappened(Integer howManyStuff);
}

public class A {
  void go() {
    I i = _ -> System.out.println("woah!!");
  }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,它显然已不再有效,声称使用"_"作为参数名称不再有效.但那么为什么它首先允许这个重构呢?为什么它适用于匿名类,而不是lambdas?这真的是一个新规则吗?或者是IDEA中的某种差异?

我正在使用Intellij-IDEA(第一次使用它),实际上,Android Studio(Beta)0.8.1(使用retrolambda允许在Android上使用lambdas),我认为它使用IDEA.

Stu*_*rks 7

在Java 8之前,单个下划线_是有效的标识符.从Java 8开始,不允许使用下划线,以便将来可能使其不是普通标识符.请参阅Brian Goetz的消息以获取解释.

在现有(pre-lambda)代码中使用下划线将生成警告,但使用下划线作为lambda形式参数名称将生成错误.正如Brian所说,"因为没有lambda的现有代码."

在您的示例中,_匿名内部类中的形式参数是合法代码,但它应该生成警告.将此代码重构为使用的lambda _将使其成为非法!由于IntelliJ IDEA正在重构此代码,因此它应该知道此规则,并且它应该提供将参数名称重命名为其他名称.

在IDEA的重构机制中,这可能被视为一个错误,或者至少需要一个增强功能.