【问题标题】:Type interference in lambda expressionlambda 表达式中的类型干扰
【发布时间】:2021-06-06 19:00:28
【问题描述】:

您能帮忙在 lambda 表达式中使用类型推断吗?我在下面给出了示例代码,如何将其转换为 lambda 表达式。

public <E> E convert(Object x, Object y) {        
    return (E) y;
}

【问题讨论】:

  • 您所写的任何内容都不会像 lambda 那样更清晰或更简单。
  • 嗨 Louis,是的,它更简单,想了解如何将其转换为像 BiFunction 这样的 lamda,你有什么想法吗?
  • 我的意思是,你可以有一个 lambda 来做同样的事情。 (x, y) -&gt; (E) y。您不能使用该 lambda 来实现 convert,而且它不会更安全,因为这是一个不安全的演员表。
  • 为什么会有Object x这个参数?它没有在方法本身中使用。
  • 该方法已经被破坏了,因为它承诺将任意对象转换为任意类型,这显然不能成立。您希望将这种损坏的方法转换为 lambda 表达式有什么好处?

标签: java spring lambda java-8 functional-interface


【解决方案1】:

假设如下函数式接口(需要 lambda 表达式):

@FunctionalInterface
interface Converter {
    <E> E convert(Object x, Object y);
}

方法 convert 不能通过 lambda 表达式表示,因为目标方法是通用的。此类 lambda 表达式的以下代码 sn-ps 无法编译。

  • static <E> void foo() {
        Converter converter = (x, y) -> (E) y;                // doesn't compile
    }
    
  • static void foo() {
        Converter converter = (x, y) -> (String) y;           // doesn't compile
    }
    

您必须在接口级别指定泛型类型:

@FunctionalInterface
interface Converter<E> {
    E convert(Object x, Object y);
}

现在可以使用 lambda 表达式了:

  • static <E> void foo() {
        Converter<E> converter = (x, y) -> (E) y;             // compiles
    }
    
  • static void foo() {
        Converter<String> converter = (x, y) -> (String) y;   // compiles
    }
    

【讨论】:

    猜你喜欢
    • 2019-12-22
    • 2019-06-22
    • 2018-10-09
    • 2011-05-03
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多