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