我主要不是Java程序员...我想找到一个相应的Java语法,用于将函数指针(模板化)存储为变量的类。函数指针指向类“外部”的函数。原始代码在C ++ 11中:
#include <memory>
template <typename T>
using p_function = T(*)(T, T, T);
template <typename T>
class A
{
private:
int k;
p_function<T> pf;
public:
A() { pf = NULL; k = 0; }
A(p_function<T> pf_, int k_) { pf = pf_; k = k_; }
T getF(const T a1, const T a2, const T a3) const { return pf(a1, a2, a3); }
};
template <typename T>
T f1(T x, T y, T z) { return x + y + z; }
template <typename T>
T f2(T x, T y, T z) { return x - y - z; }
int main()
{
A<double> aa (f1<double>, 1.0);
double val= aa.getF(1.0, 2.0, 3.0);
}
考虑到这个问题,使用界面是否合理?
public interface Function <T> {
T pf(T x, T y, T z);
}
或者,还有更好的方法吗? Java发展相对较快,可能比几年前有“更直接”的结构。有几个要求我无法联合起来。我可以在Java中要求一个简短的代码示例吗?非常感谢你的帮助。
答案 0 :(得分:2)
使用java 8.它使用“功能”接口(实际上),其中接口只定义一个单独的函数。
为了不过度使用现有的Function类,请引入自己的名称。
@FunctionalInterface
public interface TriFunction<T> {
T apply(T x, T y, T z);
}
使用FunctionalInterface注释标记它是一种阻止添加第二个函数等的做法。
class Foo {
public static Bar hop(Bar x, Bar y, Bar z) { ... }
}
TriFunction<Bar> pf = Foo::hop;
TriFunction<Integer> pg = (x, y, z) -> x + y + z;
Bar bara = pf.apply(a, b, c);
对于基本类型,更好地定义没有通用参数类型的自己的接口。高于pg
需要3次来打开包装器对象,并且一次将它再次装入对象。
包java.util.function
包含许多功能界面,例如BinaryOperator
和IntBinaryOperator
。
答案 1 :(得分:-1)
我不确定我是否正确地提出了您的问题,但请查看this stackoverflow post。
关于如何在java中实现函数指针有几个答案。
修改强>
我在C ++中没有足够的经验来提供代码示例。
编辑2
根据我上面提到的帖子,你可以尝试这样的事情:
public class WithFunction {
//Empty constructor, can be left out
public WithFunction () {...}
//The function you want to reference
public int myReferencedFunction () {...}
}
然后
public class MethodCaller {
public static Object call (Object theObject, String methodName) {
return theObject.getClass().getMethod(methodName).invoke(theObject);
//catch Exceptions
}
}
然后你可以像
那样public static void main (String [] args) {
WithFunction obj1 = new WithFunction();
Object result = MethodCaller.call (obj1, "toString");
int result = (int) MethodCaller.call (obj1, "myReferencedFunction");
}
注意:
你需要抓住很多例外。需要强大的错误处理..
如果您使用界面,您也可以多次实施它,并且应该拥有您需要的自由