我确实理解前向引用错误,但为什么我必须经历以下内容 定义n! ? 我已经注释掉了错误并添加了我看到的编译器错误。
import java.util.function.Function;
class Recursion {
Function<Integer, Integer> factorial_lambda = null;
int factorial_imp(int i) {
if (i == 1)
return 1;
else
return i * factorial_imp(i - 1);
}
/*
Function<Integer, Integer> factorial_lambda = (i) -> {
if (i == 1)
return 1;
else
return i * (factorial_lambda.apply(i - 1));
// error: self-reference in initializer
};
*/
public static void main(String[] args) { new Recursion(); }
public Recursion() {
/*
Function<Integer, Integer> factorial_lambda = (i) -> { return 1; };
// variable used in lambda expression should be final
// or effectively final;
// Function factorial_lambda = (i) -> { ...
//error: imcomparable types: Object and int if (i == 1)
//error: bad operand types for binary operator '-' apply(i - 1)
*/
factorial_lambda = (i) -> {
if (i == 1)
return 1;
else
return i * (factorial_lambda.apply(i - 1));
};
System.out.println(factorial_imp(5));
System.out.println(factorial_lambda.apply(5));
}
}
答案 0 :(得分:1)
factorial_lambda
变量(在未注释掉的代码段中),因此它不再有效。它在lambda表达式体内使用。但是在lambda表达式主体中只允许最终或有效的最终局部变量。 i
类型是Object
,而不是Integer
。使用1
运算符将其与==
进行比较显然是编译错误。所以从中减去1
。我建议尽可能避免使用原始类型。