为 Class 创建泛型

Creating a Generic for a Class

假设您有一个名为 Rational 的 class,其中每个对象包含两个代表分子和分母的整数,如果您想表明它将实现通用接口,请编写 class 定义行比较并用签名编写所需方法的主体:

public int compareTo(Object other);

这样它只会return-1或0或+1基于分子和分母的两个对象的相对顺序。

我不明白如何为 Rational1 创建一个泛型,它采用两个整数(numer,denom)。对此的任何帮助,将不胜感激。到目前为止,这是我的 Rational1 class:

public class Rational1 implements Comparable<Rational1> {
    private int numer;
    private int denom;

    public Rational1(int numer,int denom){
        this.numer = numer;
        this.denom = denom;
    }

    public Rational1(Rational1 po){
        po = new Rational1(numer, denom);

    }

    public int compareTo(Object other){
        other = new Rational1(numer, denom);
        if(numer>denom){
            return 1;
        }
        else if(numer<denom){
            return -1;
        }

        else{
        return 0;
        }
    }

}

这是我的界面:

public interface Comparable<Rational1> {
    public int compareTo(Object other);

}

最后,当我调用泛型时,我的 main 在最后一行给我一个错误:

public class Rational {

    public static void main(String[] args){
        Rational1 rational = new Rational1(4,3);
        Comparable<Rational1> ration = new Comparable<Rational1>();
    }
}

第一要务,即使它与构造函数的问题没有直接关系

public Rational1(Rational1 po) {
    po = new Rational1(numer, denom);
}

完全是胡说八道。应该是

public Rational1(Rational1 po) {
     this(po.numer, po.denom);
}

你的 main 方法也是错误的,你必须提供具体的 class 而不是接口(接口永远无法实例化):

public static void main(String[] args){
    Rational1 rational = new Rational1(4,3);
    Comparable<Rational1> ration = new Rational1();
}

最后,你的比较实现是错误的,因为:

  • 这在数学上是错误的
  • compareTo 的签名不正确。应该是 int compareTo(Rational1 that).
  • 你正在构建一个新的实例,而不是考虑你的参数。应该是

    @Override
    public int compareTo(Rational1 that) {
        return Integer.compare(numer*that.denom, that.numer*denom);
    }
    

在实现抽象 class/interface 时始终使用 @Override 以确保您确实覆盖了抽象成员。

  1. Comparable<Rational1>是一个接口。它没有构造函数。您不能实例化它的实例。我假设这是您当前遇到的错误的来源,尽管您没有指定错误是什么。

  2. 从问题描述(第一段)来看,根本不清楚您在 main() 中尝试做什么。您的主要目标是为 compareTo() 方法编写一个定义,您已经完成了。

  3. 也就是说,你写的compareTo()方法是无意义的。您需要更多地思考(或阅读)什么是有理数,以及如何将两个有理数相互比较。