Java 在匿名类中限定此vs简单名称
在下面的代码中,为什么Java认为简单名称Java 在匿名类中限定此vs简单名称,java,generics,scope,Java,Generics,Scope,在下面的代码中,为什么Java认为简单名称numCows可能无法初始化?为什么使用限定的密码可以防止错误 import java.util.function.Function; public class CowFarm { private final int numCows; public CowFarm(int numCows) { this.numCows = numCows; } // Fails to compile //
numCows
可能无法初始化?为什么使用限定的密码可以防止错误
import java.util.function.Function;
public class CowFarm {
private final int numCows;
public CowFarm(int numCows) {
this.numCows = numCows;
}
// Fails to compile
//
// CowFarm.java:12: error: variable numCows might not have been initialized
public final Function<Integer, Integer> MULTIPLY_COWS = (k -> numCows * 2);
// Works fine
public final Function<Integer, Integer> DIVIDE_COWS = (k -> CowFarm.this.numCows * 2);
}
import java.util.function.function;
公营牛场{
私人最终国际货币基金组织;
公共牛场(国际新墨西哥州){
this.numCows=numCows;
}
//未能编译
//
//java:12:错误:变量numCows可能尚未初始化
公共最终函数MULTIPLY_COWS=(k->numCows*2);
//很好
公共最终函数DIVIDE_COWS=(k->CowFarm.this.numCows*2);
}
来自:
对于每一个访问。。。在访问之前,必须明确指定空白的最终字段x,x,否则会发生编译时错误。。。这种赋值定义为当且仅当变量的简单名称(或者,对于字段,由其限定的简单名称)出现在赋值运算符的左侧时发生
类声明中出现在赋值运算符(=)左侧的final
字段在类构造函数中的final
字段之前实例化<代码>最终由此
键工作限定的字段在类构造函数之后实例化。考虑下面的例子:
public class Foo{
//Instantiated before constructor
final Bar bar1 = new Bar();
//Instantiated by constructor
final Bar bar2;
//Instantiated after constructor
final Bar bar3 = this.bar2;
//Compile time error
final Bar bar3 = bar2;
public Foo(Bar bar) {
this.bar2 = bar;
}
}
在您的例子中,问题是当您尝试实例化乘法\u奶牛时,numCows
没有明确指定。此
限定符确保在实例化MULTIPLY\u COWS
时明确指定numCows
// This works fine, as well
public final Function<Integer, Integer> DIVIDE_COWS = (k -> this.numCows * 2);
//这也很好用
公共最终函数DIVIDE_COWS=(k->this.numCows*2);