Java 在匿名类中限定此vs简单名称

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 //

在下面的代码中,为什么Java认为简单名称
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);