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.
在Java 8之前,单个下划线_
是有效的标识符.从Java 8开始,不允许使用下划线,以便将来可能使其不是普通标识符.请参阅Brian Goetz的此消息以获取解释.
在现有(pre-lambda)代码中使用下划线将生成警告,但使用下划线作为lambda形式参数名称将生成错误.正如Brian所说,"因为没有lambda的现有代码."
在您的示例中,_
匿名内部类中的形式参数是合法代码,但它应该生成警告.将此代码重构为使用的lambda _
将使其成为非法!由于IntelliJ IDEA正在重构此代码,因此它应该知道此规则,并且它应该提供将参数名称重命名为其他名称.
在IDEA的重构机制中,这可能被视为一个错误,或者至少需要一个增强功能.
归档时间: |
|
查看次数: |
487 次 |
最近记录: |