Java 将lambda转换为函数<;T、 R>;失败

Java 将lambda转换为函数<;T、 R>;失败,java,generics,lambda,Java,Generics,Lambda,映射函数几乎是标准映射函数的副本: public <R> ObjStack<R> map(Function<T, R> mapping) { return ObjStack.of(mapping.apply((T) current), history()); } 当争论失败时 对象肯定在T的范围内,Integer应该不重要,因为它是不受约束的R someInstance.map(x -> x + 1) 还有错误,someInstance属于

映射函数几乎是标准映射函数的副本:

public <R> ObjStack<R> map(Function<T, R> mapping) {
    return ObjStack.of(mapping.apply((T) current), history());
}
当争论失败时

对象
肯定在
T
的范围内,
Integer
应该不重要,因为它是不受约束的
R

 someInstance.map(x -> x + 1)
还有错误,
someInstance
属于
ObjStack
类型。在内部使用类型
对象
引用数据。我正在使用并且仅限于Java8

编辑:

错误代码:

Error: line (7)
java: method map in class ObjStack<T> cannot be applied to given types;
  required: java.util.function.Function<java.lang.Number,R>
  found: java.util.function.Function<java.lang.Object,java.lang.Integer>
  reason: cannot infer type-variable(s) R
    (argument mismatch; java.util.function.Function<java.lang.Object,java.lang.Integer> cannot be converted to java.util.function.Function<java.lang.Number,R>)
Error: line (9)
java: bad operand types for binary operator '+'
  first type:  java.lang.Number
  second type: int
错误:第(7)行
java:ObjStack类中的方法映射不能应用于给定的类型;
必需:java.util.function.function
找到:java.util.function.function
原因:无法推断类型变量R
(参数不匹配;java.util.function.function无法转换为java.util.function.function)
错误:第(9)行
java:二进制运算符“+”的操作数类型错误
第一种类型:java.lang.Number
第二类:int

为了提供有关实际
函数的通用签名的灵活性
参数,您需要为参数类型指定适当的上限和下限:

public <R> R map(Function<? super T, ? extends R> mapping) {
    // code
}
如果
someInstance
ObjStack
,那么
x
是该
函数中的
数字。换句话说,您已经创建了一个
函数
(我把
放在哪里?
,因为我不知道返回类型应该是
数字
还是,例如,
整数
)。在Java中,
Number
类型的对象不能与数学运算符一起使用(即
+
)。您需要将
x
转换为适当的类型,例如:

someInstance.map(x -> x.intValue() + 1);

尝试
public R-map(函数
x->x.hashCode()
对于
函数来说应该不会真的失败,你能用得到的错误来完成代码吗?另一个注意事项是
Number
不支持
+
操作符。有关详细信息,请参阅。
x->x.hashCode()
也应该与OP的签名一起使用。是的,但是
函数f=x->x.hashCode()
不能与OP的当前签名一起使用;如果没有
?super t
边界,他们将无法直接通过
f
。这取决于它的初始化方式。这
ObjStack someInstance=new ObjStack();someInstance.map(x->x.hashCode());
仍然可以工作。是的,那可以工作。但是OP似乎使用了类似于函数f=x->x.hashCode();ObjStack someInstance=new ObjStack();someInstance.map(f)
。当然,人们还是应该默认使用上/下界通配符,除非有充分的理由不这样做。
someInstance.map(x -> x + 1)
someInstance.map(x -> x.intValue() + 1);