Как я могу сделать Scanner.next(); вернуть какой-либо тип данных в BlueJ?

У меня есть класс ("testClass") содержащий метод. Этот класс имеет три объекта. Теперь я хочу вызвать методы этих объектов, введя команду в терминале BlueJ. Я читаю команды с помощью Scanner.next(). Если я войду Object1метод Object1 должен быть назван. Проблема в том, что Scanner.next() возвращается String, так

testClass Object = Scanner.next();
Object.testMethod();

не работает Я получаю ошибку

"Несовместимые типы: java.lang.String не может быть преобразован в testMethod.

Я тоже не хочу делать что-то подобное:

String command = Scanner.next();
switch(command){
    case "object1": object1.testMethod();

    case "object2": object2.testMethod();

    ...


}

Как я могу заставить его работать?

2 ответа

Как я могу сделать Scanner.next(); вернуть какой-либо тип данных в BlueJ?

Ты не можешь Что вы можете сделать, это написать что-то, что преобразует String в вызове команды.

Я не хочу делать что-то вроде этого [переключатель кода] тоже:

Похоже, вы хотите реализовать что-то вроде шаблона Command здесь.
Вот (очень) простой пример того, как сделать это в Java:

// This is a simple way to have a list of commands to run.
// It also gives you a very easy way to map a String to a command behavior,
// to read console commands or menu headings or something like that.
// You could also have your command invoker catch the exception and display
// a "this action is unsupported" message.

public class CommandPatternExample {
    public static void main(String[] args) throws Exception {
        CommandEnum.valueOf("A").execute(); // run command "A"
        CommandEnum.valueOf("B").execute(); // run command "B"
        CommandEnum.valueOf("C").execute(); // IllegalArgumentException
    }

    interface Command {
        void execute();
    }

    enum CommandEnum implements Command {
        A {
            @Override
            public void execute() {
                System.out.println("Running command A");
            }
        },
        B {
            @Override
            public void execute() {
                System.out.println("Running command B");
            }
        };
    }
}

Я не совсем уверен, что вы хотите сделать это. Полиморфизм может помочь вам здесь.

abstract class A {
    abstract void testMethod();
}

class ChildA extends A {
    @Override
    void testMethod() {
        // Do something
    }
}

public class Test {
    public static void main(String[] args)
            throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        A obj = (A) Class.forName("ChildA").newInstance();
        obj.testMethod();
    }
}

Вы также можете Scanner здесь, чтобы получить имя класса от пользователя во время выполнения.

Другие вопросы по тегам