java - 转换 Lambda : BiConsumer<Integer, 整数>

标签 java lambda

我遇到这样的编译器失败: BiConsumer 类型中的方法accept (Integer, Integer) 不适用于参数(Object, Object)。如何强制转换两个整数输入,以便编译器将它们接受为 <Integer, Integer>

我在以下代码中遇到失败:

import java.util.function.BiConsumer;

public class ExceptionHandlingExample {

    public static void main(String[] args) {
        int[] numberArray = { 1, 2, 3, 4 };
        int key = 2;
        calc(numberArray, key, wrapperForLambda( (a, b) -> System.out.println(a / b) ));
        // Type Safety: The expression of Type BiConsumer needs unchecked conversion to conform to unchecked BiConsumer<Integer, Integer>
    }

    private static void calc(int[] numberArray, int key, BiConsumer<Integer, Integer> consumer) {
        for (int i : numberArray) {
            consumer.accept(i, key);
        }
    }

    private static BiConsumer wrapperForLambda(BiConsumer<Integer, Integer> consumer) {
    // BiConsumer is a raw type. References to generic type BiConsumer<T, U> should be parameterized       
        return (a, b) -> consumer.accept(a, b) ;   
    // [Compilier-error] The method accept (Integer, Integer) in the type BiConsumer<Integer, Integer> is not applicable for the arguments (Object, Object) 
    }
}

我想摆脱编译器错误: BiConsumer 类型中的方法accept(Integer, Integer) 不适用于参数(Object, Object)

提前感谢您的帮助!

最佳答案

不要使用原始类型BiConsumer。将方法声明为

private static BiConsumer<Integer, Integer> 
        wrapperForLambda(BiConsumer<Integer, Integer> consumer) {   
    return (a, b) -> consumer.accept(a, b);
}

当您使用原始 BiConsumer 时,Java 将其用作 lambda 表达式 (a, b) ->consumer.accept(a, b) 的目标类型。其结果是参数 ab 被假定为 Object 类型(原始类型,记住!),这不会'无法与需要 Integerconsumer BiConsumer 一起使用。

如果这应该是一个通用方法,您可以使该方法通用:

private static <T, U> BiConsumer<T, U> 
        wrapperForLambda(BiConsumer<T, U> consumer) {   
    return (a, b) -> consumer.accept(a, b);
}

关于java - 转换 Lambda : BiConsumer<Integer, 整数>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56766939/

相关文章:

c# - 将类方法名称作为 lambda 表达式传递

java - 如何使用 RabbitMQ 和 AMQP 锁定应用程序

java - ExpandableListView 中的 Android 数据绑定(bind)

java - 如何在Visual Studio代码上添加Tomcat服务器?

java - 除了节省代码行之外,lambda 表达式还有其他用途吗?

java - 为什么这里不允许使用 lambda 函数?

java - 删除BST中的节点

java - Spring Boot RequestMapping 不适用于 Linux Fedora 26

javascript - Java 8 Lambdas 与 JavaScript 中的自执行函数

c# - 为什么 Roslyn 在尝试重写此 lambda 时会崩溃? (Visual Studio 2015 更新 1)