【问题标题】:Having trouble accessing functions through a HashMap通过 HashMap 访问函数时遇到问题
【发布时间】:2021-10-19 00:24:27
【问题描述】:

我想将命令存储在 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 的类来存储对象,我想通过控制台通过添加一些函数来访问它的函数,比如“add abc”使用构造函数 Obj(“abc”) 存储一个对象,但我无法将命令添加到哈希图中,因为我无法通过 main 访问它。

【问题讨论】:

  • 错误是什么?
  • 您正试图从静态方法访问非静态的东西。

标签: java static hashmap


【解决方案1】:

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

main方法标记为static,表示只能访问其他静态方法。 当您调用Register::add 时,这是在说“传递Register 类的add 方法的方法引用” 但是,add 不是类(静态)方法,它是一个 instance 方法,因此您必须指明要在哪个 Register 实例上调用它。

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

【讨论】:

  • Register::add 也可以转换为(Register r, String[] cmd) -&gt; r.add(cmd),但这不适合Command 接口。
猜你喜欢
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2019-05-15
  • 1970-01-01
相关资源
最近更新 更多