2016-09-11 38 views
1

下面的代碼不起作用:的Java:Genrics - 兩個類似的代碼,一個不工作

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)); 
    } 
} 

的區別是什麼?在這兩個方案,我想打電話從參數類型調用對象

+0

你能解釋一下「不起作用嗎?」你會得到什麼錯誤? – markspace

+0

您是否收到任何錯誤或錯誤的答案? – SMA

+0

錯誤:不兼容類型:統計不能轉換爲統計

回答

2

在第一個片段的不同參數類型的方法,在iob.sameAvg(dob)嘗試將Stats<Double>實例傳遞到Stats<Integer>的方法,其預計一個Stats<Integer>參數。由於Stats<Double>不是Stats<Integer>的子類,編譯器不接受它。您可以撥打obI1.equals(obI2)equals是接受Object參數的Object類的一種方法,因此您可以將任何Object實例傳遞給它。

編輯:我看到你有困惑。您的第二個代碼段有一個equals(Gen04<T> ob)方法,該方法重載Objectequals,但該方法未被調用。相反,編譯器選擇Object類的equals(Object other)方法。如果您重命名equals方法並從main調用重命名的方法,則第二個片段會產生相同的錯誤。

+1

既然你把所有的工作都弄清楚了,我會補充一點,我想如果OP將他的聲明更改爲'boolean sameAvg'(Stats ob)',我認爲方法調用將按照需要工作。 – markspace

+0

@markspace這是正確的。 – Eran

+0

@Eran:你說得對。非常感謝:) –

相關問題