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);