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

У меня есть класс ("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 ]

0 голосов
/ 24 апреля 2018

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

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 здесь, чтобы получить имя класса от пользователя во время выполнения.

0 голосов
/ 24 апреля 2018

Как мне сделать 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");
            }
        };
    }
}
...