在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。扩展java.lang.Number'
那是什么原因?如何使用定义的函数?
答案 0 :(得分:3)
在您的Function<? extends Number, Boolean> f = i -> true;
方法中应用<T extends Number> Boolean use(T n)
的问题是,您可以向f
分配一个函数,该函数采用Number
的一个子类的参数(例如{ {1}}),而您的Double
方法将尝试向其传递use
另一个子类的实例(例如Number
)。
您可以将Integer
的定义更改为
Function
将接受扩展Function<Number, Boolean> f = i -> true;
作为参数的任何类型。
或者您可以在单个通用类中定义Number
和方法,这将确保传递给Function
的参数必须与use()
期望的参数匹配:>
f
答案 1 :(得分:2)
您希望通过Function
“消耗”元素的定义应该是:
static Function<? super Number, Boolean> f = i -> true;
问题是这些定义是不相关的,您可以提供扩展了Number的某种类型的Function
,而您的use
方法可以使用扩展的 other 类型数字。
要么创建一个将这两个类包装在一起的单个类(如Eran所示);或声明您将使用Function
的{{1}};或通过Number
至少可以是Number
的任何东西