【问题标题】:Inapplicable method error regarding interfaces关于接口的不适用方法错误
【发布时间】:2020-07-17 12:33:36
【问题描述】:

我在 FindLargest 类中的一个方法 findLargest(Comparable[ ] arr) 遇到问题,该方法旨在返回数组中的最大元素。

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

FindLargest 类型中的方法 findLargest(Comparable[ ]) 不适用于参数 (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;
  }
}

【问题讨论】:

    标签: java arrays interface compare string-comparison


    【解决方案1】:

    问题是原始类型和泛型之一。 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;
    }
    

    将确保您使用泛型类型T 调用findLargest,该类型可以与自身及其所有超类进行比较。您还应该更改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 注释。

    【讨论】:

    • 感谢您的回复。我做了修改,但仍然出现同样的错误:FindLargest 类型中的方法 findLargest(T[]) 不适用于参数 (MyDate[])
    • 将您的问题编辑成Minimal, Reproducible Example。我们无法运行您的代码。我不得不修复一些事情,甚至编译你发布的代码。例如,Fraction.value() - 你的构造函数和toString 不在这里。所以没有人可以真正尝试它。我进行了我建议的更改,并在此处编译。你真的改变了MyDate吗?
    • 您当前的代码没有实现 Comparable&lt;MyDate&gt; 并且您忘记了 @Override 注释。因为public int compareTo (Object obj){ 应该是public int compareTo (MyDate date){
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 2016-04-28
    • 1970-01-01
    • 2020-03-27
    • 2015-03-10
    相关资源
    最近更新 更多