具有通配符泛型类型的Lambda

时间:2018-10-10 10:02:27

标签: 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。扩展java.lang.Number'

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

2 个答案:

答案 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的任何东西