通用 Return 类型

Generic Return Types

是否有更好的方法来编写此 getInput() 方法而不是检查每个可以传入的 class?

    public Object getInput(String prompt, Class<?> type) {
        System.out.print(prompt);
        Scanner scn = new Scanner( System.in );
        String str = scn.nextLine( );
        if(type.equals(Integer.class))
            return Integer.parseInt(str);
        else if (type.equals(Double.class))
            return Double.parseDouble(str);
        else if (type.equals(Boolean.class))
            return Boolean.parseBoolean(str);
        else return type.cast(str);
    }

它足够有效,但我想让它适用于大多数情况,而不必添加更多 else if 语句。除此之外,当我接受输入并将其分配给变量时,我需要转换为该类型。我有办法解决这个问题吗?

Invocation:
int num = (int)menu.getInput("Enter an integer: ", Integer.class);

有几种“可能”执行此操作的方法,但可能不会让您每次需要新输入类型时都修改“基本”输入法的方法之一是注入“将”工作流程解析为方法本身。

也就是说,创建一个泛型 interface,它定义了一个“解析”方法,该方法可以采用特定类型的 String 和 return 值并将其传递给您的输入法, 例如...

import java.util.Scanner;

public final class Main {

    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        Integer result = getInput("Please enter an integer: ", new IntParser());
    }

    public interface Parsable<T> {
        public T parse(String value);
    }

    public class IntParser implements Parsable<Integer> {
        @Override
        public Integer parse(String value) {
            return Integer.parseInt(value);
        }
    }

    public <T> T getInput(String prompt, Parsable<T> parser) {
        System.out.print(prompt);
        Scanner scn = new Scanner(System.in);
        String str = scn.nextLine();

        return parser.parse(str);
    }
}

现在,如果您不想每次都输入 getInput("Please enter an integer: ", new IntParser());,您可以创建方便的方法来让您的生活更轻松,例如...

public int getIntInput(String prompt) {
    return getInput(prompt, new IntParser());
}

现在,我可能会创建 class 来包含所有内容...

public class InputManager {

    public interface Parsable<T> {
        public T parse(String value);
    }

    public class IntParser implements Parsable<Integer> {
        @Override
        public Integer parse(String value) {
            return Integer.parseInt(value);
        }
    }
    
    protected Scanner scanner;

    public InputManager(Scanner scanner) {
        this.scanner = scanner;
    }

    public InputManager() {
        this(new Scanner(System.in));
    }

    public <T> T getInput(String prompt, Parsable<T> parser) {
        System.out.print(prompt);
        String str = scanner.nextLine();
        return parser.parse(str);
    }

    public int getIntInput(String prompt) {
        return getInput(prompt, new IntParser());
    }
}

可是我疯了

重要 - 这不涉及错误处理。例如,当无法解析结果时,我可能会使用 Parsable return null ,否则您可能应该定义一个 ParsingException 以便调用知道它们职责

也许你可以尝试使用反射,因为这些 类(Integer, Boolean...) 通常有一个静态 valueOf 方法:

    public static void main(String[] args) {
        int input = getInput("1", Integer.class);
        System.out.println(input);
    }

    public static <T> T getInput(String input, Class<T> type) {
        try {
            Method valueOf = type.getMethod("valueOf", String.class);
            return type.cast(valueOf.invoke(null, input));
        } catch (Exception e) {
            return null;
        }
    }