映射函数几乎是标准映射函数的副本:
public <R> ObjStack<R> map(Function<T, R> mapping) {
return ObjStack.of(mapping.apply((T) current), history());
}
哪里T
继承自类签名 ObjStack<T>
使用
Function<Object, Integer> f = x -> x.hashCode();
因为论证失败。
Object
绝对在 T
的范围内和Integer
应该不重要,因为它是 R
不受限制。
someInstance.map(x -> x + 1)
也有错误,someInstance
类型为ObjStack<Number>
。使用类型 Object
引用数据内部。我正在使用并仅限于 Java 8。
编辑:
错误代码:
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
最佳答案
为了提供有关实际 Function
的通用签名的灵 active 您需要为参数类型指定适当的上限和下限:
public <R> R map(Function<? super T, ? extends R> mapping) {
// code
}
如果没有这些界限,Function
实现必须匹配 T
和R
确切地。有了这些界限,Function
实现可以匹配 T
或使用 T
的任何父类(super class)型并匹配R
或使用 R
的任何子类型。第一个通用参数使用 super
的原因第二个通用参数使用 extends
是因为Function
使用 T
类型的对象并生成一个 R
类型的对象—参见What is PECS (Producer Extends Consumer Super)? .
关于:
someInstance.map(x -> x + 1)
如果someInstance
是 ObjStack<Number>
然后x
是 Number
在那Function
。换句话说,您创建了一个 Function<Number, ???>
(我在其中放置 ???
因为我不知道返回类型是否应该是 Number
或者,例如 Integer
)。在 Java 中,Number
类型的对象不能与数学运算符一起使用(即 +
)。您需要转换x
到适当的类型,例如:
someInstance.map(x -> x.intValue() + 1);
关于java - 将 lambda 转换为 Function<T, R> 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58309441/