【问题标题】:Compiler does not unbox lambda parameter int编译器不拆箱 lambda 参数 int
【发布时间】:2019-06-05 13:29:53
【问题描述】:

所以我试图传递一个函数来对 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&lt;Integer&gt;中定义的

我错过了什么?我瞎了吗?还是这在 java 中不起作用?

我在 macbook 上使用 intellij CE 版本 2019.1.2 和 OpenJDK 11.0.1。

【问题讨论】:

  • IntUnaryOperator 会不会比 int[] 更好?
  • 你能发布完整的源代码吗?这两种情况都对我有用...
  • 也适用于我,尽管是在 Java 8 上。
  • @chrylis,编译器应该从第二个参数的类型推断x的类型(如Integer)到register.apply()。完成此操作后,应该毫不犹豫地拆箱 x。对我来说,确实如此。
  • 无法重现。您可以发布有关您的设置的详细信息吗?哪个java?哪个IDE?也许是一些非标准的编译器?像eclipse编译器一样?可能是一个错误。它应该能够自行推断类型并取消装箱。

标签: java lambda type-inference unboxing


【解决方案1】:

Oleksandr 示例:

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

不起作用,编译器给我:

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

这确实有效:

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

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

但最好的解决方案是使用我什至不知道 RealSkeptic 在上面的 cmets 中建议的 IntUnaryOperator 接口。

public void apply(int index, IntUnaryOperator func) {
    V[index] = func.applyAsInt(V[index]);
}

感谢您的帮助

【讨论】:

    猜你喜欢
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2010-11-08
    • 1970-01-01
    • 2017-05-05
    相关资源
    最近更新 更多