class Foo {
private final Function<Object, ?> func;
public Foo(Function<Object, ?> func) {
this.func = func;
}
public Object doSomething(Object in) {
return func.apply(in);
}
}
但我怀疑你是否真的想要那样。 Java 是一种名义上的类型化语言——你应该使用名称,而且很多。 “对象”没有多大意义。例如,假设函数需要能够转换 any 对象,那么您传入的函数不能对该对象执行任何操作(嗯,除了toString、hashCode 和所有对象都有的其他方法)。该函数可以强制转换输入,但这很丑。
这听起来已经是一个更好的计划了:
class Foo<F, T> {
private final Function<? super F, ? extends T> func;
public Foo(Function<? super F, ? extends T> func) {
this.func = func;
}
public T doSomething(F in) {
return func.apply(in);
}
}
F 和 T 是 'from' 和 'to' 的缩写。它是? super F 的原因是因为如果您希望将字符串转换为整数,并且您有一个将任何对象转换为整数的函数,那也很好:您希望它转换字符串或其任何超类型,对于 'to',任何子类型也可以。
根据您最近的 cmets 扩展此答案:
Java 不是动态类型。鉴于提供的输入,没有任何可能有意义或可能没有意义的随机神秘功能。因此,如果你想要一个描述 setter 的函数,例如需要 2 个输入参数',那么这是一个完全不同的概念:那将是一个需要设置接收器和新值的函数,并且什么也不返回。 2 个输入,0 个输出。 j.u.f.Function 是 1 个输入,1 个输出。
2 个输入,0 个输出将是 java.util.function.BiConsumer<T, U>。查看这些类型的 java.util.function API。
class Example {
private String name;
public void setName(String name) { this.name = name; }
public String getName() { return name; }
public static final BiConsumer<Example, String> SETTER = Example::setName;
}
class SomeplaceElse {
void foo() {
Example e = new Example();
String n = "hello";
Example.SETTER.accept(e, n);
System.out.println(e.getName()); // prints 'hello'
}
}