【问题标题】:Java generic lambda callJava 通用 lambda 调用
【发布时间】:2016-05-01 22:01:42
【问题描述】:

我有一个类,它在构造函数中有一个接口对象:

private Operator(/* ..., */ final Operation<?> operation) {
    //...
}

操作是一个通用接口,只有一个方法:

@SuppressWarnings("unchecked")
public T applyOperation(T... arguments);

我现在可以像这样创建一个 Operator 类的对象:

public static final Operator POSTFIX_INCREASE = new Operator(/* ...,*/ new Operation<Integer>() {

    @Override
    public Integer applyOperation(Integer... arguments) {
        return arguments[0]++;
    }
});

但我想使用 lambda 表达式。这是 eclipse 本身推荐的(到目前为止看起来不错):

public static final Operator POSTFIX_INCREASE = new Operator("++", 0, 1, true, arguments -> arguments[0]++);

唯一的问题...它不起作用 :D 我当然知道,我需要提供类型信息:我需要 Operator 接口的整数实现。在匿名类中,我可以只提供默认方式,但在 lambda 表达式中,这是不可能的。有没有办法编写一个通用的 lambda 表达式,或者他们不支持吗? (这不会是什么大惊喜,因为泛型在 java 中不是很灵活)

【问题讨论】:

  • arguments提供显式类型
  • 这是什么意思?接口中的变量参数应该是通用的。或者你的意思是在 lambda 表达式中调用参数?因为那时我想知道如何提供明确的参数
  • Java 不知道 arguments 的类型是什么。它无法从任何地方推断出来。以(Integer... arguments) -&gt; ... 为例。
  • 太好了,这正是我正在寻找的:D 我知道我需要显式提供类型,但我不知道我可以直接在 lambda 内部的参数上执行此操作.您可以将其发布为答案,以便我将其标记为已解决吗?

标签: java generics lambda


【解决方案1】:

由于您的参数类型使用通配符

final Operation<?> operation

并且实例创建表达式没有额外的类型信息

public static final Operator POSTFIX_INCREASE = new Operator("++", 0, 1, true, arguments -> arguments[0]++);

编译器无法决定 lambda 表达式参数的类型推断。

你需要在这里明确。要么改变你的构造函数参数类型

private Sample(/* ..., */ final Operation<Integer> operation) {

或指定 lambda 参数类型

new Operator("++", 0, 1, true, (Integer... arguments) -> arguments[0]++)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多