通过 HashMap 访问函数时遇到问题

Having trouble accessing functions through a HashMap

我想将命令存储在 HashMap 中,但是即使我已经创建了存储 HashMap 的对象的实例,我也无法从 main 访问它。

interface Command{
    void execute(String[] args);
}

public class Register {
    private ArrayList<Obj> reg = new ArrayList<Obj>();
    private HashMap<String, Command> commands = new HashMap<String, Command>();

    protected void add(String[] cmd) {
        if(cmd.length>=4) {
            reg.add(new Obj(cmd[1]);
        }
    }
    
    
    public static void main(String args[]){
        Register a = new Register();
        Scanner read = new Scanner(System.in);
        
        a.commands.put("add", Register::add);
        
        while(true) {
            String line = read.nextLine();
            String cmd[] = line.split(" ");
            
            a.commands.get(cmd[0]).execute(cmd);
        }
        read.close();
    }
}

我正在使用一个名为 register 的 class 来存储对象,我想通过向其添加一些函数来通过控制台访问它的函数,例如“add abc”使用构造函数存储一个对象Obj("abc"),但我无法将命令添加到哈希图中,因为我无法通过 main 访问它。

问题出在a.commands.put("add", Register::add);

main方法被标记为static,表示它只能访问其他静态方法。 当您调用 Register::add 时,这试图说“传递 Register class 的添加方法的方法引用” 但是,add 不是 class(静态)方法,它是 instance 方法,因此您必须指出 Register 的哪个实例想调用它。

您需要传递 Register 的特定实例。例如,a::add 将代替它工作。