在 Java 中传递方法

Passing Methods in Java

我正在尝试完成 Java 中的方法传递。

这是我尝试做的虚拟示例的鸟瞰图:

public final class A {
  private String value;

  public A(String value) {
    this.value = value;
  }

  public final Object bind(Function<String, String> func) {
    this.value = func.apply(value);

    return this;
  }

  // Rest of the logic here to deal with `value`
}

public final class B {
  public static void main(String[] args) {
    A<T> a = new A("hello");
    a.bind(B::methodOne).bind(B::methodTwo);
  }

  private String methodOne(String s) {
    // method logic here

    return "haha";
  }

  private String methodTwo(String s) {
    // method logic here

    return "hi";
  }
}

所以,基本上,在上面的示例中,我在 a class、B 中有方法,我想将 B 的方法传递给 A 并存储该方法的 return 值B 在 A 上的进一步处理。

我尝试使用 Java 的 method reference 功能,但由于我不是每天使用 Java 编写代码,所以我很难理解围绕如何在满足上述约束的同时正确完成此任务。

目前,我在 main 方法中进行绑定时遇到 incompatible types: invalid method reference 错误。

更新

更改了我对程序的限制。

编辑:提问者在阅读此答案后更新了他们的问题。至关重要的是,最初每个方法都有完全不同的签名(不同的参数类型和数量,以及不同的 return 类型)。我将保持这个答案不变,请注意它不再与当前问题特别相关。

这不太好用,因为你要传递的方法有完全不同的签名(methodOne 的是 (B, String) -> int (为什么你里面有一个大写的 I Int,是不是打错了?), methodTwo 是 (B) -> String, methodThree 是 (B, String, String) -> String.

在 java 中,lambda 必须适合函数式接口。不可能为可变数量的输入参数提供功能接口。

使用泛型,您可以尝试掩盖输入和输出的类型每次都不同的事实。

这听起来真的很像一个 X/Y 问题:你有问题 X(你没有解释,我们也不知道它是什么),你想:我知道!我将使用 lambdas 来抽象出 'a method' 的概念...现在你正在问这个问题。

但你问错了问题。问 X。因为即使假设你可以以某种方式将你的 3 个方法都放在同一个 lambda 类型中(你不能),你也将无法调用它们。

这是另一个可行的想法,但我不知道它是否解决了你的 X,因为你没有解释这一点:

@FunctionalInterface
public interface MyXThinger {
    Object result(Object... args);
}

如果你想调用它,你怎么知道特定的 MyXThinger(你没有解释 X 是什么,所以我不能在这里想出一个好名字)如果你传递 2 个字符串,如果你传递任何其他字符串就会崩溃?这或多或少是我发现您的问题描述不足以在此处提供可靠建议的原因。

您正在静态上下文中编写表达式 B::methodOne

非静态方法有一个不可见的参数,叫做'the receiver':就是实例。

因此,在静态上下文中,B::methodOne 具有签名:(B, String) -> String。你的bind方法要的是(String) -> String,这两个不兼容。因此,这不起作用。

有两种修复方法:

  1. 创建实例:B b = new B(); a.bind(b::methodOne);。表达式 b::methodOne,其中 b 是类型 B 的变量,引用 B 的实际实例(使用 new B() 创建)确实具有所需的签名 (String) -> String
  2. 创建 methodOne 方法 static,此时它不再具有不可见的 B instance 参数。

你的代码也充满了新手错误;您必须调用 a.bind 而不是 A.bind,使用 A 和 B 作为 class 名称非常混乱,您的绑定方法 returns 对象(它应该 return A), 等等。解决这些问题的方法是学习基本的 java, 我认为;尝试一点一点地解决这些错误似乎不适合 Whosebug 的用途。因此,我将这些作为练习留给您。