java - 将 lambda 转换为 Function<T, R> 失败

标签 java generics lambda

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

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实现必须匹配 TR确切地。有了这些界限,Function实现可以匹配 T或使用 T 的任何父类(super class)型并匹配R或使用 R 的任何子类型。第一个通用参数使用 super 的原因第二个通用参数使用 extends是因为Function 使用 T 类型的对象并生成一个 R 类型的对象—参见What is PECS (Producer Extends Consumer Super)? .

<小时/>

关于:

someInstance.map(x -> x + 1)

如果someInstanceObjStack<Number>然后xNumber在那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/

相关文章:

kotlin - 如何在这里使用 lambda 表达式?

c++ - 将 lambda 函数作为参数传递 C++

java - 如何从 RES 导出的 .jar 文件调用 ILOG 规则?

java - 序列化在构造函数中初始化的映射

java - AngularJS 与 RESTful MySQL

java - vector/泛型搜索 java

java - 集合<有什么用?扩展 SomeAbstractClass> 而不是 Collection<SomeAbstractClass>

java - 使用 Spring 和 Maven 时,将代码部署到服务器的最佳方式是什么?

Java 在泛型中使用静态声明

c# - Entity Framework 4 : How to turn a string into an object for . OrderBy(p => p.fieldname)?