如何编写适用于Lambda的通用方法?

3

我有如下接口:

public interface Mapper {
    public <T> T map(T element);
}

当我使用 Mapper mapper = (int n) -> n*2; 时,出现了问题:

非法的 lambda 表达式:类型 Mapper 的 map 方法是泛型的

我错过了什么?如何创建一个通用方法以在 lambda 表达式中使用?

1个回答

2
你应该修改你的定义为:
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;

是的,谢谢,这确实有效。但是为什么我不能像List接口中的.toArray方法一样在方法级别声明类型参数? <T> T[] toArray(T[] a) - THE Waterfall
@THEWaterfall,你可以这样做,但是你对抽象方法“map”的实现需要推断类型/转换为整数以执行操作“*2”,这就是你必须编写匿名类来表示完整实现而不仅仅是lambda表达式的地方...我不确定toArray能否用作lambda表达式,你是否在某个地方读到过使用lambdas的toArray - Naman
但是如果我这样写:(Integer element) -> element * 2。我不是已经明确类型转换为 Integer 了吗?我不确定 toArray 是否可以在 Lambda 中使用,但我只是困惑于无法使用方法级类型参数生成通用方法并在 Lambdas 中使用。 - THE Waterfall
@THEWaterfall 实际上,这就是重复问题(父级)中链接的规范所述的内容。如果在方法级别绑定,则类型不会转换为整数。 - Naman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接