【问题标题】:Generic functional interface通用功能接口
【发布时间】:2014-07-18 07:33:01
【问题描述】:

我遇到了一些 lambda 问题。
我正在尝试使用 lambda 表达式和函数式接口来创建接受函数式接口和一些参数的方法并执行该函数。

这是我的代码:

@FunctionalInterface
interface TwoArgumentFunction {
    public <T, K, V> T doJob(K arg1, V arg2);
} //I know I've ommited return value in that case


class SomeClass {
<T, K, V> T runLongAction(TwoArgumentFunction action, K arg1, V arg2){
    SwingWorker<T, Void> worker = new SwingWorker<T, Void>(){

        @Override
        protected T doInBackground() throws Exception {
            {... some code ... }
            return action.doJob(arg1, arg2);
        }
        @Override
        protected void done(){
            {... some code ... }
        }

    };
    worker.execute();
    try {
        return worker.get();
    } catch (InterruptedException | ExecutionException e) {
        {... some code ... }
    }
}


void mainInvoke(ArgType1 arg1, ArgType2 arg2){
    runLongAction((arg1, arg2) -> doSomething(arg1, arg2), arg1, arg2);
}

}

我有错误:

方法 runLongAction(( arg1, arg2) -> {}, ArgType1, ArgType2) 对于 SomeClass 类型未定义

我什至尝试将 lambda 转换为 TwoArgumentFunction 但后来我得到了:

非法的 lambda 表达式:TwoArgumentFunction 类型的方法 doJob 是通用的

Anonymous 类而不是 lambda 表达式可以正常工作,这是我找到的最简单的解决方法。

【问题讨论】:

  • TwoArgumentFunctionjava.util.function.BiFunction 一样吗?

标签: java generics lambda java-8


【解决方案1】:

试试看:

  @FunctionalInterface
  interface TwoArgumentFunction<T, K, V> {
     T doJob(K arg1, V arg2);
  } //I know I've ommited return value in that case

  public <T, K, V> T runLongAction(final TwoArgumentFunction<? extends T, ? super K, ? super V> action, final K arg1, final V arg2) {
    return action.doJob(arg1, arg2);
  }

  private void test() {
    final String a = "A";
    final Long b = 1L;
    this.runLongAction((ta, tb) -> {return 1;}, a, b);
  }

你把泛型放在方法上,而我把它放在接口上。我还添加了? super? extends(但没有它也可以工作)。

如果你不知道它,如果你需要它,你也可以把类型放在 lambda 中:

this.runLongAction((String ta, Long tb) -> {return 1;}, a, b);

【讨论】:

  • 好的,我犯了三个错误。我在 lambda 和方法中使用了相同名称的变量,生成方法而不是接口,并在 lambda 中省略返回。即使我不需要它们,它似乎也是必需的(因为我的 doSomething 是无效类型的)。感谢您的帮助。
【解决方案2】:

您无需创建 Java 8 中已经存在的接口。您应该使用“BiFunction”接口,它有一个方法“R apply(T t, U u))”。

【讨论】:

  • 你是对的,但这只是简单的代码,我不能在我的实际应用程序中使用 BiFunction。
【解决方案3】:

我没有看到 doSomething() 方法

但这对我有用

void mainInvoke(ArgType1 arg1, ArgType2 arg2){
    runLongAction(this::doSomething, arg1, arg2);
}

private <T, K, V> T doSomething(K arg1, V arg2) {
  // TODO Auto-generated method stub
  return null;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 2017-09-10
    • 2020-08-10
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多