0

コンソール メニュー アプリケーション用にインターフェイス IExecutable を実装する必要があります。実装しているメソッドは次のとおりです。Object execute(Object o); だから私はメニューを表示します。コンソールから、整数または文字列のメニュー オプションを読み取りました。実行時に次のエラーが発生しました: 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);

    }

}
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

以下は、オブジェクトから文字列または整数オブジェクトを取得するより表現力豊かな方法です。

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

instanceOfこれについては、上記のどれを行うべきかを知るために演算子を使用する必要があるかもしれません。instanceOf はこれを行うのに最適な方法ではありません ( Is instanceof は悪い習慣と見なされますか? もしそうなら、どのような状況で instanceof はまだ望ましいですか?を参照してください)。現在の設計では、instanceOf チェックを含める必要があると思います

于 2013-04-01T13:15:34.087 に答える
0

コンソールから、整数または文字列のメニューオプションを読み取りました

ユーザーがメニュー オプションとして 3 または X を入力できる場合は、取得した値を整数に解析しないでください。

MenuOptions のコードがある場合は、そのキー プロパティを整数ではなく文字列に変更します。そうでない場合は、迅速な修正が必要になる場合があります

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 に答える