2016-09-11 3 views
1

以下のコードは動作しません動作しません:のJava:Genrics - 二つの類似したコード、1は

class Stats<T extends Number> 
    { 
    T[] nums; 

    Stats(T[] o) 
    { 
     nums = o; 
    } 

    double average() 
    { 
     double sum = 0.0; 
     for(int i=0; i < nums.length; i++) 
      sum += nums[i].doubleValue(); 
     return sum/nums.length; 
    } 

    boolean sameAvg(Stats<T> ob) 
    { 
     if(average() == ob.average()) 
      return true; 
     return false; 
    } 
} 

class BoundsDemo 
{ 
    public static void main(String args[]) 
    { 
     Integer inums[] = { 1, 2, 3, 4, 5 }; 
     Stats<Integer> iob = new Stats<Integer>(inums); 
     double v = iob.average(); 
     System.out.println("iob average is " + v); 

     Double dnums[] = { 1.1, 2.2, 3.3, 4.4, 5.5 }; 
     Stats<Double> dob = new Stats<Double>(dnums); 
     double w = dob.average(); 
     System.out.println("dob average is " + w); 

     if(iob.sameAvg(dob)) 
      System.out.println("Averages are the same."); 
     else 
      System.out.println("Averages differ."); 
    } 
} 

しかし、次のような作品:

class Gen04<T extends Number> 
    { 
    T num; 
    void set(T a) 
    { 
     num = a; 
    } 

    T get() 
    { 
     return num; 
    } 

    boolean equals(Gen04<T> ob) 
    { 
     if(num.doubleValue() == ob.get().doubleValue()) 
      return true; 
     else 
      return false; 
    } 
} 
class GenericCompare 
{ 
    public static void main(String args[]) 
    { 
     Gen04<Integer> obI1 = new Gen04<Integer>(); 
     obI1.set(new Integer(5)); 

     Gen04<Double> obI2 = new Gen04<Double>(); 
     obI2.set(new Double(5.0)); 

     System.out.println("obI1 and obI2 are equal = "+obI1.equals(obI2)); 
    } 
} 

違いは何ですか?両方のプログラムでは、私はiob.sameAvg(dob)にあなたが期待するStats<Integer>の方法にStats<Double>インスタンスを渡そうと、呼び出し側のオブジェクト最初のスニペットで

+0

"動作しない"と正確に説明できますか?どのようなエラーが出ますか? – markspace

+0

何か間違いや間違いがありますか? – SMA

+0

エラー:互換性のないタイプ:統計は統計に変換できません

答えて

2

のパラメータの型と異なるパラメータの型を持つメソッドを呼び出すようにしようとしていますa Stats<Integer>引数。 はサブクラスStats<Integer>ではないため、コンパイラはそれを受け入れません。

2番目のスニペットではobI1.equals(obI2)と呼びます。 equalsは、Object引数を受け入れるObjectクラスのメソッドであるため、Objectインスタンスを渡すことができます。

編集:私はあなたが混乱しているのを見ました。 2番目のスニペットにequals(Gen04<T> ob)メソッドがあり、Objectequalsがオーバーロードされますが、そのメソッドは呼び出されていません。その代わりに、コンパイラはクラスのequals(Object other)メソッドを選択します。 equalsメソッドの名前を変更し、mainから名前を変更したメソッドを呼び出すと、2番目のスニペットで同じエラーが発生します。

+1

すべての作業を分かったので、OPが宣言を 'boolean sameAvg(Stats ob)'に変更した場合、メソッド呼び出しが必要に応じて機能すると思います。 – markspace

+0

@markspaceそれは正しいです。 – Eran

+0

@エラン:それは正しいです。ありがとうございます:) –

関連する問題