generics - 具有通配符泛型类型的 Lambda

标签 generics lambda java-8

在java中我有以下lambda:

Function<? extends Number, Boolean> f = i -> true;

接下来我想按以下方式使用这个 lambda:

public <T extends Number> Boolean use(T n) {
  return f.apply(n);
}

但是编译器给出了“不兼容的类型:T 无法转换为 capture#1 of ?”扩展 java.lang.Number'

那么原因是什么?我该如何使用我定义的函数?

最佳答案

申请Function<? extends Number, Boolean> f = i -> true;的问题在你的<T extends Number> Boolean use(T n)方法是您可以分配给 f一个函数,它接受 Number 的一个子类的参数(比如 Double )而你的 use方法将尝试将 Number 的另一个子类的实例传递给它。 (比如 Integer )。

您可以更改您的 Function定义为

Function<Number, Boolean> f = i -> true;

它将接受扩展 Number 的任何类型作为参数。

或者您可以定义 Function以及单个泛型类中的方法,这将确保参数传递给 use()必须与 f 期望的参数匹配:

class Generic<T extends Number> {
    Function<T, Boolean> f = i -> true;

    public Boolean use(T n) {
        return f.apply(n);
    }
}

关于generics - 具有通配符泛型类型的 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52737615/

相关文章:

Java 8 将列表按涉及先前元素的条件分组

java - 如何找出每个对象在 ArrayList<Object> 中的类型?

c# - 比较 : LINQ vs LAMBDA Expression

c# - 在 C# 中对 IList 进行排序

Python(SymPy、SciPy),从字符串创建符号 lambda

entity-framework - 如何调用 lambda 表达式中的方法在 Entity Framework 中运行?

java - 如何将 catch finally 重组为 Java 8 中的一种方法?

java - 为什么我不能将 Function.identity 引用为收集器中的方法引用

java - Java EE 中的 for-each 循环和泛型

java - 如何将 StringBinding 和 ReadOnlyProperty 作为通用参数传递?