代码之家  ›  专栏  ›  技术社区  ›  thirdy

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

  •  5
  • thirdy  · 技术社区  · 16 年前

    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;
        }
    

    我有一个警告“类型安全:从整数到T的未检查强制转换”。除了@SuppressWarnings之外,是否可以避免此警告?

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

    8 回复  |  直到 16 年前
        1
  •  7
  •   Andreas Dolk    16 年前

    你可以用 Class#cast cast

    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;
    }
    

    注意,我已经稍微更改了方法签名-应该是 Class<T> 而不是 Class<?> 为了保证 Class 实例与类型参数一致。

        2
  •  2
  •   Tom Hawtin - tackline    16 年前

    其他人已经向你展示了如何使用 Class.cast ,但是你应该怎么做呢?

    readInt , readString readFloat readDouble 方法。而且,我怀疑 Scanner

        3
  •  2
  •   S73417H    16 年前

    我想你可能是想把这个问题抽象化了。这么做有什么不对?

        Scanner scanner = new Scanner(System.in);
    
        System.out.println("Give me a boolean:");
        boolean bool = scanner.nextBoolean();
    
        System.out.println("Give me an integer:");
        int integer = scanner.nextInt();
    

    不需要强制转换,您仍然需要以任何方式处理异常。。。。。。。。

    记住吻,“保持简单愚蠢”。。。

        4
  •  1
  •   Abhinav Sarkar    16 年前

    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)
                return c.cast(scanner.nextInt());
            if(c == String.class)
                return c.cast(scanner.nextLine());
            if(c == Double.class)
                return c.cast(scanner.nextDouble());
            if(c == Float.class)
                return c.cast(scanner.nextFloat());
        } catch (InputMismatchException e) {
            throw new Exception(e);
        }
        return null;
    }
    
        5
  •  0
  •   Community Mohan Dere    9 年前

    Java generic function: how to return Generic type 我摆脱了我的警告:

    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)
                    return c.cast(scanner.nextInt());
                if(c == String.class)
                    return c.cast(scanner.nextLine());
                if(c == Double.class)
                    return c.cast(scanner.nextDouble());
                if(c == Float.class)
                    return c.cast(scanner.nextFloat());
            } catch (InputMismatchException e) {
                throw new Exception(e);
            }
            return null;
        }
    
        6
  •  0
  •   Vadim Fedorov    16 年前

    @SuppressWarnings (unchecked) 注释。

    在特殊情况下,您会收到此警告,因为该参数不保证 Class<?> c

        7
  •  0
  •   Eyal Schneider    16 年前

    您可以执行以下操作:

        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) 
                   return c.cast(scanner.nextInt()); 
               if(c == String.class) 
                   return c.cast(scanner.nextLine()); 
               if(c == Double.class) 
                   return c.cast(scanner.nextDouble()); 
               if(c == Float.class) 
                   return c.cast(scanner.nextFloat()); 
           } catch (InputMismatchException e) { 
               throw new Exception(e); 
           } 
           return null; 
       } 
    

    但是,我强烈建议不要抛出异常。抛出更具体的异常(原始运行时异常或某些适当的已检查异常)。

        8
  •  0
  •   andrewmu    16 年前

    通过使用传入的具体类来强制转换对象,可以消除警告:

        public static <T> T readFromInput(String message, Class<T> c) throws Exception{
            ..
                return c.cast(Integer.valueOf(scanner.nextInt()));
            ..
        }
    

    在本例中,我试图实现多个readFromInput方法,这些方法被您所需的类型覆盖,例如。 公共静态整数readFromInput(字符串消息,c类) 等。

    推荐文章