2017-10-12 92 views
0

我写了一个类来为不同的Number类执行数字操作。但是,在每个退货声明中我都会收到类型安全警告。如何避免Java中数字操作中的类型安全警告?

为什么return语句会导致类型安全问题,因为我已经知道,例如,summand1和summand2都是Double的实例?我怎样才能避免这种警告?

public class NumberOperation { 
     public static <R extends Number & Comparable<R>> R addition(R summand1, R summand2) { 
      if (!summand1.getClass().equals(summand2.getClass())) 
       throw new IllegalArgumentException("Two different classes are used in the parameters: " + summand1.getClass().getName() + ", " + summand2.getClass().getName()); 
      if(summand1 instanceof Double && summand2 instanceof Double) 
       return (R) new Double(summand1.doubleValue() + summand2.doubleValue()); 
      else if(summand1 instanceof Float && summand2 instanceof Float) 
       return (R) new Float(summand1.floatValue() + summand2.floatValue()); 
      else if(summand1 instanceof Long && summand2 instanceof Long) 
       return (R) new Long(summand1.longValue() + summand2.longValue()); 
      else if(summand1 instanceof Integer && summand2 instanceof Integer) 
       return (R) new Integer(summand1.intValue() + summand2.intValue()); 
      else if(summand1 instanceof Short && summand2 instanceof Short) 
       return (R) new Short((short) (summand1.shortValue() + summand2.shortValue())); 
      else if(summand1 instanceof Byte && summand2 instanceof Byte) 
       return (R) new Byte((byte) (summand1.byteValue() + summand2.byteValue())); 
      else 
       throw new IllegalArgumentException(summand1.getClass().getName() + " is not supported."); 
     } 
} 
+2

你为什么要写这样的东西? – mlecz

+0

这里有什么不能用BigDecimal处理的东西吗? –

+0

我写它是因为我有另一个关于范围的类,我将在这里同时使用Integer,Long和Double。我需要为该类中的方法执行数字操作,但我不想编写3个类,如RangeInt,RangeDouble等。 –

回答

1

我觉得你让这个问题比现在更困难。也许BigDecimal等可以为你做这一切。但如果你想坚持你的代码,它可以工作,如果你删除所有的泛型:

public static Number addition(Number summand1, Number summand2) { 
    if (!summand1.getClass().equals(summand2.getClass())) 
      throw new IllegalArgumentException("Two different classes are used in the parameters: " + summand1.getClass().getName() + ", " + summand2.getClass().getName()); 
    if(summand1 instanceof Double && summand2 instanceof Double) 
      return new Double(summand1.doubleValue() + summand2.doubleValue()); 
    else if(summand1 instanceof Float && summand2 instanceof Float) 
      return new Float(summand1.floatValue() + summand2.floatValue()); 
+1

谢谢。看起来我一开始就把事情弄得太复杂了......对我而言,BigDecimal似乎是一个很好的选择。 –

相关问题