[英]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
,这两个不兼容。 因此,这不起作用。
有两种方法可以修复它:
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
所需。methodOne
方法设为static
,此时它不再具有不可见的B instance
参数。 你的代码也充斥着新手错误; 您必须调用a.bind
而不是A.bind
,使用 A 和 B 作为类名非常混乱,您的绑定方法返回 Object (它应该返回A
)等。解决这些问题的方法是学习基本的 java,我认为; 试图一点一点地解决这些错误似乎不适合 stackoverflow 的用途。 因此,我将这些留给您作为练习。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.