【问题标题】:How to write a generic method for lambda? [duplicate]如何为 lambda 编写泛型方法? [复制]
【发布时间】:2019-01-07 01:27:59
【问题描述】:

我有如下界面:

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

当我这样做时Mapper mapper = (int n) -&gt; n*2; 我得到了问题:

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

我在这里缺少什么?如何创建用于 lambda 表达式的泛型方法?

【问题讨论】:

    标签: java lambda


    【解决方案1】:

    您应该将定义更改为

    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 方法那样在方法级别声明类型参数? &lt;T&gt; T[] toArray(T[] a)
    • @THEWaterfall 您可以,但是您对抽象方法 map 的实现将需要将类型/强制转换为 Integer 以执行操作 *2,这是您必须始终编写一个匿名类来代表完整的实现,而不仅仅是 lambdas...我不确定 toArray 是否可以用作 lambda,你有没有在某个地方读到 toArray 在 lambdas 中使用?
    • 但如果我这样做(Integer element) -&gt; element * 2。我不是已经明确地将类型转换为整数吗?我不确定 toArray 是否在 lambdas 中使用,但我很困惑,不可能使用方法级别类型参数创建泛型方法以便在 lambdas 中使用。
    • @THEWaterfall 实际上,这就是重复问题(父级)中链接的规范的内容。如果在方法级别绑定,则类型不会转换为 Integer。
    猜你喜欢
    • 1970-01-01
    • 2013-08-15
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 2023-01-01
    相关资源
    最近更新 更多