关于接口的不适用方法错误

Inapplicable method error regarding interfaces

我的方法之一有问题 findLargest(Comparable[ ] arr) in class FindLargest这意味着 return 数组中最大的元素。

显然,在 class Lab5Main 中,此方法适用于分数,但我遇到日期编译错误。在系统打印命令中,我收到此错误:

The method findLargest(Comparable[ ]) in the type FindLargest is not applicable for the arguments (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;
  }
}

问题是原始类型和泛型之一。 Comparable 是一个通用接口,但您使用原始类型实现它 并且 您将它与原始类型一起使用。你应该解决这个问题。像,

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 时使用的泛型 T 可以与自身及其所有超类进行比较。您还应该更改 FractionMyDate。像,

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 注释。