Java - 使用Callable void来解析方法

时间:2014-04-01 09:13:01

标签: java switch-statement callable

我有以下代码:

    private static void createMenu(String nameOfMenu, Callable<Void> case1, Callable<Void> case2, Callable<Void> case3 )  throws Exception{
            System.out.println(nameOfMenu+" Options");
            System.out.println("What would you like to do?(Type the appropriate slection number)");
            System.out.println("(1) Add "+nameOfMenu);
            System.out.println("(2) Edit "+nameOfMenu);
            System.out.println("(3) Remove "+nameOfMenu);
            System.out.println("(4) Return to Main Menu");
            System.out.println("To quit the program, type 'Q'");
            String input = scanner.nextLine().toLowerCase();
            while (!"1".equals(input) && !"2".equals(input) && !"3".equals(input) && !"4".equals(input) && !"q".equals(input)) {
                System.err.println("Please enter 1, 2, 3, 4 or 'q' only");
                input = scanner.nextLine().toLowerCase();
            }
            switch (input) {
                case "1":
case1.call();
                    break;
                case "2":
case2.call();
                    break;
                case "3":
case3.call();
                    break;
                case "4":
                    mainMenu();
                    break;
                case "q":
System.exit(0);
                    System.out.println("Thank you!");
                    break;
            }
        }

我有第二种尝试调用上述方法的方法

private static void callingMethod(){
createMenu("menu name",method(),method1(),method2());
}

所有方法都是静态void。 Netbeans给我一个错误,说这里不允许'void'类型。 我该如何解决这个错误?

2 个答案:

答案 0 :(得分:2)

Callable不是一种方法。这是一个界面。所以尝试这样的事情:

class MyTask implements Callable<Void> {
    @Override
    public Void call() throws Exception {
        // do something

        return null;
    }
}

...

private static void callingMethod() {
    createMenu("menu name", new MyTask(), new MyTask(), new MyTask());
}

答案 1 :(得分:0)

如果可读性不是优先级,则可以使用匿名类:

createMenu("menu name",
     new Callable<Void>() {

        @Override
        public Void call() throws Exception {
            method();
            return null;
        }

    },
    new Callable<Void>() {

        @Override
        public Void call() throws Exception {
            method1();
            return null;
        }

    },
     new Callable<Void>() {

        @Override
        public Void call() throws Exception {
            method2();
            return null;
        }

    });