繁体   English   中英

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";
  }
}

所以,基本上,我在一个类中有方法,在上面的例子中是 B,我想将 B 的方法传递给 A 并将 B 的该方法的返回值存储在 A 上以供进一步处理。

我试图利用 Java 的method reference功能,但由于我不是每天都用 Java 编写代码,所以我很难在满足上述约束的同时正确地实现这一点。

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

更新

对我对程序的限制进行了更改。

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

这不能很好地工作,因为您要传递的方法具有完全不同的签名(methodOne 是(B, String) -> int (为什么在那里有大写​​的 I Int ,这是一个错字吗?),methodTwo 是(B) -> String ,而 methodThree 是(B, String, String) -> String

在 java 中,lambdas 必须适合函数式接口。 对于可变数量的输入参数,不可能有一个功能接口。

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

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

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

这是一个更可行的概念,但我不知道它是否能解决您的 X,因为您没有解释这一点:

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

如果你想调用这个,你怎么知道特定的MyXThinger (你没有解释 X 是什么,所以我在这里不能想出一个好名字)如果你传递 2 个字符串就可以工作,如果你通过则崩溃还要别的吗? 这就是.. 或多或少为什么我发现你的问题描述不足以在这里给出可靠的建议。

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

非静态方法有一个不可见的参数,称为“接收者”:它是实例。

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

有两种方法可以修复它:

  1. 创建一个实例: B b = new B(); a.bind(b::methodOne); 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 作为类名非常混乱,您的绑定方法返回 Object (它应该返回A )等。解决这些问题的方法是学习基本的 java,我认为; 试图一点一点地解决这些错误似乎不适合 stackoverflow 的用途。 因此,我将这些留给您作为练习。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM