编译器不拆箱 lambda 参数 int
Compiler does not unbox lambda parameter int
所以我试图传递一个函数来对 int[x] 值执行操作。
所以这是我的方法:
public void apply(int index, UnaryOperator<Integer> func) {
V[index] = func.apply(V[index]);
}
这个有效:
register.apply(0, new UnaryOperator<Integer>() {
@Override
public Integer apply(Integer x) {
return x & 6;
}
});
这有效:
UnaryOperator<Integer> func = x -> x & 6;
register.apply(0, func);
但这给了我一个编译错误:
register.apply(0, x -> x & 6);
"Operator & can not be applied to java.lang.Object, int"
编译器似乎无法推断出类型,即使它是在方法声明中定义的 UnaryOperator<Integer>
我错过了什么?我瞎了吗?还是这在 java 中不起作用?
我在 macbook 上使用的是 intellij CE 版本 2019.1.2 和 OpenJDK 11.0.1。
Oleksandr 示例:
register.apply(0, (Integer x) -> x & 6);
不工作,编译器给我:
incompatible types in lambda expression, Expected Object but found Integer
这确实有效:
register.apply(0, x -> (x & 6));
通过明确告诉它先执行按位运算,然后再执行 return (我仍然无法解释为什么这行得通,但现在行得通了)
但最好的解决方案是使用 IntUnaryOperator
界面,我什至不知道 RealSkeptic 在上面的评论中建议的界面。
public void apply(int index, IntUnaryOperator func) {
V[index] = func.applyAsInt(V[index]);
}
感谢您的帮助
所以我试图传递一个函数来对 int[x] 值执行操作。
所以这是我的方法:
public void apply(int index, UnaryOperator<Integer> func) {
V[index] = func.apply(V[index]);
}
这个有效:
register.apply(0, new UnaryOperator<Integer>() {
@Override
public Integer apply(Integer x) {
return x & 6;
}
});
这有效:
UnaryOperator<Integer> func = x -> x & 6;
register.apply(0, func);
但这给了我一个编译错误:
register.apply(0, x -> x & 6);
"Operator & can not be applied to java.lang.Object, int"
编译器似乎无法推断出类型,即使它是在方法声明中定义的 UnaryOperator<Integer>
我错过了什么?我瞎了吗?还是这在 java 中不起作用?
我在 macbook 上使用的是 intellij CE 版本 2019.1.2 和 OpenJDK 11.0.1。
Oleksandr 示例:
register.apply(0, (Integer x) -> x & 6);
不工作,编译器给我:
incompatible types in lambda expression, Expected Object but found Integer
这确实有效:
register.apply(0, x -> (x & 6));
通过明确告诉它先执行按位运算,然后再执行 return (我仍然无法解释为什么这行得通,但现在行得通了)
但最好的解决方案是使用 IntUnaryOperator
界面,我什至不知道 RealSkeptic 在上面的评论中建议的界面。
public void apply(int index, IntUnaryOperator func) {
V[index] = func.applyAsInt(V[index]);
}
感谢您的帮助