改进我的Java通用控制台输入法?

thi*_*rdy 5 java generics console input

使用Java Generics,我尝试实现通用控制台输入方法.

public static <T> T readFromInput(String message, Class<?> c) throws Exception{
        System.out.println(message);
        Scanner scanner = new Scanner(System.in);
        try {
            if(c == Integer.class)
                return (T) Integer.valueOf(scanner.nextInt());
            if(c == String.class)
                return (T) scanner.nextLine();
            if(c == Double.class)
                return (T) Double.valueOf(scanner.nextDouble());
            if(c == Float.class)
                return (T) Float.valueOf(scanner.nextFloat());
        } catch (InputMismatchException e) {
            throw new Exception(e);
        }
        return null;
    }
Run Code Online (Sandbox Code Playgroud)

我有一个警告"类型安全:未经检查从整数转换为T".除了@SuppressWarnings,是否可以避免此警告?

有没有更好的方法来实现我的方法?提前致谢

And*_*s_D 7

您可以使用该Class#cast方法,但应该留下一些注释,因为即使cast不创建警告,如果无法进行强制转换,它也会在运行时抛出ClassCastException.

public static <T> T readFromInput(String message, Class<T> c) throws Exception{
    System.out.println(message);
    Scanner scanner = new Scanner(System.in);
    try {
        if(c == Integer.class)
            // the next cast to Integer is safe
            return c.cast(Integer.valueOf(scanner.nextInt()));
        if(c == String.class)
            // the next cast to String is safe
            return c.cast(scanner.nextLine());
        if(c == Double.class)
            // the next cast to Double is safe
            return c.cast(Double.valueOf(scanner.nextDouble()));
        if(c == Float.class)
            // the next cast to Float is safe
            return c.cast(Float.valueOf(scanner.nextFloat()));
    } catch (InputMismatchException e) {
        throw new Exception(e);
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

请注意,我稍微更改了方法签名 - 应该Class<T>而不是Class<?>保证Class实例与type参数一致.