Java 将对象强制转换为整数或字符串的问题

Java 将对象强制转换为整数或字符串的问题,java,Java,我必须为控制台菜单应用程序实现一个可执行的接口因此我显示菜单。我从控制台读取一个菜单选项,可以是整数或字符串。执行时,我有以下错误: java.lang.String不能转换为java.lang.Integer 问题是,哪种方式是实现这种转换的最佳方式 ConsoleMenu.java public Object execute(Object o) { show(); o = read(); try{ int choice

我必须为控制台菜单应用程序实现一个可执行的接口因此我显示菜单。我从控制台读取一个菜单选项,可以是整数或字符串。执行时,我有以下错误: java.lang.String不能转换为java.lang.Integer 问题是,哪种方式是实现这种转换的最佳方式

ConsoleMenu.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;
    }
Main.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);

    }

}
在您的错误行上:

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

    //complete here
}

调用
(String)o

下面是从对象获取字符串或整数对象的一种更具表现力的方式

String.class.cast(o);
Integer.class.cast(o);
我认为对于这一点,您可能还必须使用
instanceOf
操作符来知道要执行上述哪项操作。instanceOf不是一种很好的方法(请参阅),有些人会尽一切努力避免它。在您当前的设计中,我认为您必须包含一个instanceOf check

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

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

如果您有菜单选项的代码,请将其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);

您确定错误发生在您指示的行上,并且错误就是您显示的吗?错误出现在行
i=(整数)菜单上。执行(i)。您应该强烈地重新考虑您的设计,这样您就不会有原始的
对象
,它们可能是两种不同的实际类型中的一种……与直接的强制转换相比,
class.cast()
有何改进?我只是觉得它读起来更好。你实际上是在用英语说你是CastingMM,但我不确定这是否有助于解决这个问题。我相信instanceOf会解决这个问题,尽管正如你在评论中所说,我也建议重新设计