Неприменимая ошибка метода относительно интерфейсов - PullRequest
2 голосов
/ 05 апреля 2020

У меня проблема с одним из моих методов findLargest (Comparable [] arr) в классе FindLargest , который предназначен для возврата самого большого элемента в массиве.

Очевидно, в классе Lab5Main этот метод отлично работает с дробями, но я получаю ошибку компиляции с датами. В команде системной распечатки я получаю эту ошибку:

Метод findLargest (Comparable []) в типе FindLargest не применим для аргументов (MyDate [])

Вот предполагаемый вывод программы :

The largest fraction is 9/4
The latest date is 18/8/2011

Мои коды приведены ниже:

public class Lab5Main {

  public static void main(String[] args) {

    // Fraction
    Fraction fractions[] = new Fraction[3];
    fractions[0] = new Fraction(1, 2);
    fractions[1] = new Fraction(6, 11);
    fractions[2] = new Fraction(9, 4);
    System.out.println("The largest fraction is " + FindLargest.findLargest(fractions));

    // MyDate
    MyDate dates[] = new MyDate[3];
    dates[0] = new MyDate(1898, 6, 9);
    dates[1] = new MyDate(2003, 4, 1);
    dates[2] = new MyDate(2011, 8, 18);
    System.out.println("The latest date is " + FindLargest.findLargest(dates));

  }
}
public class FindLargest {
    public static <T extends Comparable<? super T>> T findLargest(T[] arr) {
        if (arr.length == 0) {
            return null;
        }
        T max = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (arr[i].compareTo(max) > 0) {
                max = arr[i];
            }
        }
        return max;
    }
public class Fraction implements Comparable<Fraction> { 
    private int num, denom;

public int gcd(int a, int b)  {  
        if (a%b==0) {
            return b;
        }
        return gcd(b, a%b);  
    } 

    public void reduce()  {  
        int g = gcd(num, denom);  

        num = num / g;  
        denom = denom / g;  
    }  

    public Fraction(int n, int d) {

        if (n==0) {
            d=1;
        }
        if (d==0) {
            n=1;
            d=2;
        }
        if(d<0) {
            n=-n;
            d=-d;
        }

        num = n;
        denom = d;

        reduce();
    }

    public String toString() {
        return num + "/" + denom;
    }

@Override
      public int compareTo(Fraction f) {
//        Fraction f = (Fraction) obj;
          if (Math.abs(value() - f.value()) < 0.00001) {
              return 0;
          }
          if (value() > f.value()) {
              return 1;
          }
          return -1;
      }
      public int compareTo(Object obj) {
          Fraction f = (Fraction) obj;
          if (Math.abs(value() - f.value()) < 0.00001) {
              return 0;
          }
          if (value() > f.value()) {
              return 1;
          }
          return -1;
      }

}

public class MyDate implements Comparable<MyDate> {
  private int year, month, day;

public MyDate(int z, int y, int x) {
      if (z<1000 || z>3000) {
          z = 2000;
      }
      if (y<1 || y>12) {
          y = 1;
      }
      if (x<1 || x>31) {
          x = 1;
      }

      day = x;
      month = y;
      year = z;
  }

  public String toString() {
        return day + "/" + month + "/" + year;
    }

  @Override
  public int compareTo (MyDate date){
//    MyDate date = (MyDate) obj;
      int diffYear = year - date.year;
      if (diffYear < 0) {
          return -1;
      }
      else if (diffYear > 0) {
          return 1;
      }

      int diffMonth = month - date.month;
      if (diffMonth < 0) {
          return -1;
      }
      else if (diffMonth > 0) {
          return 1;
      }

      int diffDay = day - date.day;
      if (diffDay < 0) {
          return -1;
      }
      else if (diffDay > 0) {
          return 1;
      }

      return 0;
  }
}

1 Ответ

2 голосов
/ 05 апреля 2020

Этот вопрос относится к типам raw и дженерикам. Comparable является универсальным c интерфейсом, но вы реализуете его с необработанным типом и , вы используете его с необработанным типом. Вы должны это исправить. Что-то вроде

public static <T extends Comparable<? super T>> T findLargest(T[] arr) {
    if (arr.length == 0) {
        return null;
    }
    T max = arr[0];
    for (int i = 0; i < arr.length; i++) {
        if (arr[i].compareTo(max) > 0) {
            max = arr[i];
        }
    }
    return max;
}

гарантирует, что вы вызовете findLargest с обобщенным c типом T, который можно сравнить с самим собой и со всеми его 'суперклассами. Вы также должны изменить Fraction и MyDate. Что-то вроде

public class Fraction implements Comparable<Fraction> { 
    // ...
    @Override
    public int compareTo(Fraction f) {
        if (Math.abs(value() - f.value()) < 0.00001) {
            return 0;
        }
        if (value() > f.value()) {
            return 1;
        }
        return -1;
    }
}

и MyDate аналогично. Я бы порекомендовал вам всегда использовать аннотацию @Override, когда вы собираетесь переопределить метод.

...