2017-10-12 14 views
0

異なるNumberクラスに対して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

私は範囲についての別のクラスを持っているので、私はそれを書いて、私は両方の整数、長いとダブルを使用します。私はそのクラスのメソッドの数値演算を行う必要がありますが、私はRangeInt、RangeDoubleなどの3つのクラスを記述したくありません。 –

答えて

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は私の場合には良い選択肢のようです。 –

関連する問題