C++;指向Java函数指针

C++;指向Java函数指针,java,c++,Java,C++,我正在寻找以下类似的Java实现。C++中的代码是使用函数指针适当调用方法,这取决于输入,避免了丑陋的…如果梯子。(请排除基于多态性的解决方案-基本上创建新类以及允许特定实现的接口。在我的项目中也不能使用Java 8(lambda)) Java中有其他选择吗 #include "stdafx.h" #include <map> #include <iostream> using namespace std; class Func; typedef void (Func:

我正在寻找以下类似的Java实现。C++中的代码是使用函数指针适当调用方法,这取决于输入,避免了丑陋的…如果梯子。(请排除基于多态性的解决方案-基本上创建新类以及允许特定实现的接口。在我的项目中也不能使用Java 8(lambda))

Java中有其他选择吗

#include "stdafx.h"
#include <map>
#include <iostream>
using namespace std;

class Func;
typedef void (Func::*FUNC_TYPE) ();

class Func
{
 public:
    Func() 
    {
        fncMap[1] = &Func::fn1;
        fncMap[2] = &Func::fn2;
        fncMap[3] = &Func::fn3;
        fncMap[4] = &Func::fn4;
    }
    void fn1(){ cout << "fn1" << endl; }
    void fn2(){ cout << "fn2" << endl; }
    void fn3(){ cout << "fn3" << endl; }
    void fn4(){ cout << "fn4" << endl; }
    map<int, FUNC_TYPE> fncMap;
};

void callAppropriateFunction (Func& Ob, int input)
{
    auto itrFind = Ob.fncMap.find(input);

    if (itrFind == Ob.fncMap.end()) return;

    FUNC_TYPE fn = itrFind->second;

    (Ob.*fn) ();
}

int _tmain(int argc, _TCHAR* argv[])
{
    Func Ob;
    int i;
    cin >> i;

    callAppropriateFunction(Ob, i);

    return 0;
}
#包括“stdafx.h”
#包括
#包括
使用名称空间std;
类Func;
typedef void(Func::*Func_TYPE)();
类函数
{
公众:
Func()
{
fncMap[1]=&Func::fn1;
fncMap[2]=&Func::fn2;
fncMap[3]=&Func::fn3;
fncMap[4]=&Func::fn4;
}

void fn1(){cout使用一个方法定义一个接口,或者使用一个现有接口。然后使列表函数指针成为接口类型的变量列表

在您的例子中,您的函数不接受任何参数,并且具有
void
返回类型。Java接口
Runnable
对应于此。使用Java 8方法引用引用这些函数

这是您的代码的Java版本

import java.util.HashMap;
import java.util.Map;

public class Func {

    private final Map<Integer, Runnable> fncMap = new HashMap<>();

    public Func() {
        fncMap.put(1, this::fn1);
        fncMap.put(2, this::fn2);
        fncMap.put(3, this::fn3);
        fncMap.put(4, this::fn4);
    }

    private void fn1() {
        System.out.println("fn1");
    }

    private void fn2() {
        System.out.println("fn2");
    }

    private void fn3() {
        System.out.println("fn3");
    }

    private void fn4() {
        System.out.println("fn4");
    }

    public static void callAppropriateFunction(Func ob, int input) {
        final Runnable fn = ob.fncMap.get(input);
        if (fn != null) {
            fn.run();
        }
    }
}

使用JavaLambdas(仅限于Java8及以上版本)几乎可以实现这一点


尝试通过reflection调用方法,可能类似于以下内容:

        Method method = YourClass.class.getMethod("fn1", YourClass.class);
        method.invoke();

@BoPersson谢谢,但我不能在我的项目中使用Java 8。@对象请忽略,因为我错过了您对Java 8的评论
//declare a functional interface
@java.lang.FunctionalInterface
public interface FunI {
    public void fun();
}

public class MainProgram {

    public static void main(String[] args){
        AnArrayList integers = new AnArrayList();

        //Interface type holds the lambda
        FunI[] functionsArray = [];
        functionsArray.push(()->{System.out.println("1");})
        functionsArray.push(()->{System.out.println("2");})

        //on some criteria
        if(condition){FunI[i].fun();}
    }

}
        Method method = YourClass.class.getMethod("fn1", YourClass.class);
        method.invoke();