在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/