【发布时间】:2019-01-07 01:27:59
【问题描述】:
我有如下界面:
public interface Mapper {
public <T> T map(T element);
}
当我这样做时Mapper mapper = (int n) -> n*2;
我得到了问题:
非法的 lambda 表达式:Mapper 类型的方法映射是泛型的
我在这里缺少什么?如何创建用于 lambda 表达式的泛型方法?
【问题讨论】:
我有如下界面:
public interface Mapper {
public <T> T map(T element);
}
当我这样做时Mapper mapper = (int n) -> n*2;
我得到了问题:
非法的 lambda 表达式:Mapper 类型的方法映射是泛型的
我在这里缺少什么?如何创建用于 lambda 表达式的泛型方法?
【问题讨论】:
您应该将定义更改为
public interface Mapper<T> { // type bound to the interface
T map(T element);
}
然后将其用作:
Mapper<Integer> mapper = element -> element * 2; // notice Integer and not 'int' for the type
也可以写成:
Mapper<Integer> mapper = (Integer element) -> element * 2;
【讨论】:
.toArray 方法那样在方法级别声明类型参数? <T> T[] toArray(T[] a)
map 的实现将需要将类型/强制转换为 Integer 以执行操作 *2,这是您必须始终编写一个匿名类来代表完整的实现,而不仅仅是 lambdas...我不确定 toArray 是否可以用作 lambda,你有没有在某个地方读到 toArray 在 lambdas 中使用?
(Integer element) -> element * 2。我不是已经明确地将类型转换为整数吗?我不确定 toArray 是否在 lambdas 中使用,但我很困惑,不可能使用方法级别类型参数创建泛型方法以便在 lambdas 中使用。