2017-07-10 68 views
2

のために働いていない私が何をしようとしていますものです:オートボクシングとアンボクシングルールsum = sum+ t;を1としてオートボクシング/オートアンボクシングはここで有界Typeパラメータ

class MyNumbers<T extends Number>{ 

    private T[] array; 

    MyNumbers(T[] array){ 
      this.array = array; 
     } 
    public void setArray(T[] array){ 
     this.array = array; 
    } 
    public T[] getArray(){ 

      return this.array; 
     } 


    public double avarage(){ 

      double avg =0.0; 
      double sum =0.0; 
      for(T t: array){ 
        sum += t.doubleValue(); // working 
        sum = sum+ t; // not working 

       } 
       return sum/array.length;   } 
} 

動作するはずです。既にNumberクラスで拡張されているTとしては機能しません。

public class BoundedTypeParam{ 

    public static void main(String [] args){ 

     Integer[] ints = {1,2,3,4,5,6}; 
     MyNumbers<Integer> stats4Ints = new MyNumbers<>(ints); 

     System.out.println("Avg is same : "+ stats4Ints.avarage()); 

    } 

} 

私が行方不明ですどれルール/概念を:ここで

は、私は、次のタイプにしようとするものです。

PS。私は認識可能な型、消去で認識しています

+1

「動作していません」と表示されていても、何を観察しているかはわかりません。コンパイル時の問題?実行時の例外?他に何か?理想的には、[mcve]を提供しますが、少なくとも*明確なエラー記述を提供してください。 –

+1

あなたは 'sum + t'が何を期待しているのか不明です、btw。 't'が' Number'をタイプしていればうまくいくと思いますか? –

+0

コンパイラは、ジェネリック "T"のターゲットプリミティブタイプを認識していないため、コンパイルしません。そして演算子 '+'はプリミティブデータまたは 'String'にcastintigを必要とします。 –

答えて

6

これはジェネリックとは関係ありません。 TをNumberに置き換えた場合はうまくいかないでしょう。

Numberタイプからプリミティブタイプへのアンボクシング変換はありません。したがって、Numberは数値演算子のオペランドにすることはできません。

次のコードは、コードと同じ理由でコンパイルに失敗します - The operator += is undefined for the argument type(s) double, Number

Number n = 5; 
double sum = 0.0; 
sum += n; 
+0

ohh!これらの小さなものはいつも大きな画像をクリアするのに役立ちます。ありがとう – optional

0

アレイは消去されず、タイプコレートはまったく適用されません。 double[]は、Double[]と決して同じではなく、2つのどちらもNumber[]になりません。あなたは実行時に実際に持っていることである

class Example<T extends Number> { 
    private T[] arr; 
} 

class com.Example { 
    private Number[] arr; 
} 

順番に次のコードことを意味:

for(T t: array) { 
    <...snip...> 
} 

がコンパイルされ、このような結合型変数によって

このコード内:

for (Number t: array) { 
    <...snip...> 
} 

数字の種類についての情報はなく、Numberクラスで動作する演算子はJavaで定義されていないため、カスタム番号を指定したライブラリや、 BigIntegerBigDecimalのようなクラスです。

関連する問題