2017-08-27 3 views
0

再帰を介してNumber(the class)型の数の累乗を計算する関数を作成したいと考えています。バインドされた汎用型のバイナリ計算

return base * NumberOpp.power(base, pow - 1); 

「*」操作の実行方法はわかりません。次の行に問題があります。私はこれがジェネリック型のためだと推測しています。私はこの問題を解決すると考えている。私はキャストしようとしました(少し醜いです)。どちらもうまくいきませんでした。

return (T) (Number.doubleValue(base) * Number.doubleValue(NumberOpp.power(base, pow - 1))); 

すべてのコードは以下の通りです:

public class NumberOpp { 
    public static <T extends Number> T power(T base, int pow){ 
     if (pow == 1) { /* If power is one return base */ 
      return base; 
     }else{ /* Else recursivly multiply by base until power is one */ 
      return base * NumberOpp.power(base, pow - 1); 
     } 
    } 
} 
+0

[Javaが既に提供している実装](https://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#pow)を使用しない理由はありますか? (double、%20double))? –

+1

'*'乗算演算子は数値*プリミティブ*でのみ動作します。定義上、Javaのジェネリック型はプリミティブではありえないので、戻り値の型 'T'は' * '乗算演算子と互換性がありません。自動ボックス化でさえも、コンパイラが行うものなのでどの型が 'T 'であるのかわからないので、どのアンボクシング操作を適用するのか分からない(int?long?double?...)。 – Andreas

+0

短い答え:再帰の使い方を学ぶのは割り当てです。しかし、私は将来ジェネリック医薬品を扱うことを望むかもしれません。 – macrocypher

答えて

1

あなたは数字のみプリミティブ型に(例えば乗算など)数値演算を実行することができます。 Numberにプリミティブな数値型への自動変換がないため、<T extends Number>型の境界が役立たないのはこのためです。

あなたはこのような doubleとして、具体的な数値型の操作を行うことを決定することができ

public class NumberOpp { 
    public static <T extends Number> double power(T base, int pow) { 
     if (pow == 1) { 
      return base.doubleValue(); 
     } else { 
      return base.doubleValue() * NumberOpp.power(base, pow - 1); 
     } 
    } 
} 

これは、入力として任意の数値型を受け入れますが、常にdouble結果を返します。

関連する問題