编译器不会取消对lambda参数int的装箱

时间:2019-06-05 13:29:53

标签: java lambda type-inference unboxing

所以我试图传递一个函数来对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);
  

“运算符&不能应用于java.lang.Object,int”

即使在方法声明UnaryOperator<Integer>中定义了编译器,编译器似乎也无法推断类型。

我想念什么?我瞎了吗?还是在Java中不起作用?

我在Macbook上使用的是intellij CE版本2019.1.2和OpenJDK 11.0.1。

1 个答案:

答案 0 :(得分:2)

夹竹桃示例:

ItemTemplate

不起作用,编译器给我:

  

lambda表达式中的不兼容类型,“期望的对象”,但找到了“整数”

这确实有效:

register.apply(0, (Integer x) -> x & 6);

通过明确地告诉它先执行按位运算,然后返回(我仍然无法解释为什么这样做行得通,但现在不行了)

但是最好的解决方案是使用RealSkeptic在上面的评论中甚至没有意识到的register.apply(0, x -> (x & 6)); 接口。

IntUnaryOperator

感谢您的帮助