首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lambda的造型: BiConsumer<Integer,Integer>

Lambda的造型: BiConsumer<Integer,Integer>
EN

Stack Overflow用户
提问于 2019-06-26 14:58:03
回答 4查看 303关注 0票数 0

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

我在下面的代码中得到了失败:

代码语言:javascript
复制
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)

提前感谢您的帮助!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-06-26 15:06:48

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

代码语言:javascript
复制
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 (请记住,是原始类型!),这将不适用于需要Integers的consumer BiConsumer

如果这是一个通用的方法,你可以让这个方法泛型:

代码语言:javascript
复制
private static <T, U> BiConsumer<T, U> 
        wrapperForLambda(BiConsumer<T, U> consumer) {   
    return (a, b) -> consumer.accept(a, b);
}
票数 2
EN

Stack Overflow用户

发布于 2019-06-26 15:07:25

我不知道wrapperForLambda的用途是什么。你不需要它。只需按如下方式调用calc

代码语言:javascript
复制
calc(numberArray, key, (a, b) -> System.out.println(a / b));

wrapperForLambda中的错误可以通过以下方式消除:

代码语言:javascript
复制
private static BiConsumer wrapperForLambda(BiConsumer<Integer, Integer> consumer) {
     return consumer;
}

但我仍然认为这种方法毫无意义。

附注:我假设calc方法中的循环应该在someNumbers数组上迭代,而不是在numberArray (它是main方法的局部变量)上迭代。

票数 2
EN

Stack Overflow用户

发布于 2019-06-26 15:07:06

您可以将其用作

代码语言:javascript
复制
    return (a, b) -> consumer.accept((Integer) a, (Integer) b);

在Java 1.5之前,你甚至不能这样做:

代码语言:javascript
复制
    int a;

    Object x = (Integer) a;

编译器会抱怨a属于原始数据类型,因此不能强制转换为对象。

从Java1.5开始,Java引入了自动装箱的概念。因此,下面的代码变得OK了:

代码语言:javascript
复制
    int a;

    Object x = (Integer) a;

因为编译器知道如何自动将原始int类型转换为装箱类型Integer;而从Integer转换为Object,这不是问题。

然而,你要做的是:

代码语言:javascript
复制
    int a;

    Object x = (int) a;

基本上是告诉编译器避免装箱。您显式地告诉编译器将a保留为int,并将对该int的引用放入一个对象中。编译器不是为处理这种情况而设计的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56766939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档