0

我必须为控制台菜单应用程序实现一个接口 IExecutable。我正在实现的方法是:Object execute(Object o); 所以我显示菜单。我从控制台读取了一个可能是整数或字符串的菜单选项。在执行时我有这个错误: java.lang.String 不能转换为 java.lang.Integer 问题是哪种是进行这种转换的最佳方式。

控制台菜单.java

public Object execute(Object o) {
        show();
        o = read();
        try{
            int choice = Integer.parseInt((String) o); // error on this line
            IExecutable menuOption = getMenuOptions(choice);
            if(menuOption != null){
                o = menuOption.execute(o);
                return o;
            }
              } catch(Exception e){
            System.out.println("Invalid option"+ e.getMessage());       
        }

        return null;
    }

private static IExecutable getMenuOptions(int i){
    for(MenuOptions option :  options){
        if(option.getKey() == i && option.getIsActive()){
            return option;

        }
    }
    return null;
}

public static Object read(){
        String option = null;
        BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
        try {
                option = buffer.readLine();
                return option;

            } 
        catch (IOException e) {
            System.out.println("IOException " +e.getMessage());
        }
        return null;
    }

主.java

public class Main {


    public static void main(String[] args) {
        Integer i = new Integer(1);
        ConsoleMenu menu = new ConsoleMenu("MATH OPERATIONS");
        menu.addMenuOption(new SubOption());
        menu.addMenuOption(new AddOption());
        i = (Integer) menu.execute(i);

    }

}
4

3 回答 3

0

在您的错误行:

if (o != null && o instanceof Integer){
    Integer choice = (Integer)o;

    //complete here
}
于 2013-04-01T13:13:46.643 回答
0

当您调用时,您假设 o 实际上是一个字符串(String) o

下面是从 Object 获取 String 或 Integer 对象的更具表现力的方式

String.class.cast(o);
Integer.class.cast(o);

我认为为此,尽管您可能还必须使用instanceOf运算符来知道要执行上述哪个操作。instanceOf 不是这样做的好方法(请参阅Is instanceof 被认为是不好的做法?如果是,在什么情况下 instanceof 仍然更可取?),有些人会做任何事情来避免它。在您当前的设计中,我认为您必须包含一个 instanceOf 检查

于 2013-04-01T13:15:34.087 回答
0

我从控制台读取了一个可能是整数或字符串的菜单选项

如果用户可以输入 3 或 X 作为菜单选项,则不应将获得的值解析为整数。

如果您有 MenuOptions 的代码,请将其 key 属性更改为字符串而不是整数。如果您不这样做,则可能需要快速修复

private static IExecutable getMenuOptions(String i){
     for(MenuOptions option :  options){
        if(i.equals(option.getKey()+"")) && option.getIsActive()){
            return option;
        }
    }
    return null;
}

可以称为

IExecutable menuOption = getMenuOptions((String) o);
于 2013-04-01T13:19:42.590 回答