2017-10-12 95 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似乎是一個很好的選擇。 –

相關問題