2016-09-11 1 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>, который ожидает a Stats<Integer> аргумент. Поскольку Stats<Double> не является подклассом Stats<Integer>, компилятор его не принимает.

Во втором фрагменте вы вызываете obI1.equals(obI2). equals - это метод класса Object, который принимает аргумент Object, поэтому вы можете передать ему экземпляр Object.

EDIT: Я вижу, вы были в замешательстве. В вашем втором фрагменте есть метод equals(Gen04<T> ob), который перегружает Objectequals, но этот метод не вызывается. Вместо этого компилятор выбирает метод equals(Object other) класса Object. Если вы переименуете свой метод equals и вызовите переименованный метод из вашего main, второй фрагмент даст такую ​​же ошибку.

+1

Поскольку вы сделали всю работу, выяснив это, я просто добавлю, что я думаю, что если OP изменяет свое объявление на 'boolean sameAvg (Stats ob)', я думаю, что вызов метода будет работать по желанию. – markspace

+0

@markspace Это правильно. – Eran

+0

@Eran: Вы поняли это правильно. Большое спасибо :) –

Смежные вопросы