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