我得到了一个类似这样的编译器失败:类型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)
提前感谢您的帮助!
发布于 2019-06-26 15:06:48
不要使用原始类型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)的目标类型。这样做的结果是,假设参数a和b的类型为Object (请记住,是原始类型!),这将不适用于需要Integers的consumer BiConsumer。
如果这是一个通用的方法,你可以让这个方法泛型:
private static <T, U> BiConsumer<T, U>
wrapperForLambda(BiConsumer<T, U> consumer) {
return (a, b) -> consumer.accept(a, b);
}发布于 2019-06-26 15:07:25
我不知道wrapperForLambda的用途是什么。你不需要它。只需按如下方式调用calc:
calc(numberArray, key, (a, b) -> System.out.println(a / b));wrapperForLambda中的错误可以通过以下方式消除:
private static BiConsumer wrapperForLambda(BiConsumer<Integer, Integer> consumer) {
return consumer;
}但我仍然认为这种方法毫无意义。
附注:我假设calc方法中的循环应该在someNumbers数组上迭代,而不是在numberArray (它是main方法的局部变量)上迭代。
发布于 2019-06-26 15:07:06
您可以将其用作
return (a, b) -> consumer.accept((Integer) a, (Integer) b);在Java 1.5之前,你甚至不能这样做:
int a;
Object x = (Integer) a;编译器会抱怨a属于原始数据类型,因此不能强制转换为对象。
从Java1.5开始,Java引入了自动装箱的概念。因此,下面的代码变得OK了:
int a;
Object x = (Integer) a;因为编译器知道如何自动将原始int类型转换为装箱类型Integer;而从Integer转换为Object,这不是问题。
然而,你要做的是:
int a;
Object x = (int) a;基本上是告诉编译器避免装箱。您显式地告诉编译器将a保留为int,并将对该int的引用放入一个对象中。编译器不是为处理这种情况而设计的。
https://stackoverflow.com/questions/56766939
复制相似问题