为类创建通用

时间:2015-05-24 19:15:26

标签: java class generics comparable

假设你有一个名为Rational的类,其中每个对象包含两个表示分子和分母的整数,如果你想表明它将实现泛型接口Comparable并编写所需方法的主体,则编写类定义行。签名:

public int compareTo(Object other);

这样它只会根据分子和分母的两个对象的相对顺序返回-1或0或+1。

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

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>();
    }
}

2 个答案:

答案 0 :(得分:2)

首先,即使它与你的构造函数

的问题没有直接关系
public Rational1(Rational1 po) {
    po = new Rational1(numer, denom);
}

完全是胡说八道。它应该是

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

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

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);
    }
    

在实现抽象类/接口时始终使用@Override以确保覆盖抽象成员。

答案 1 :(得分:2)

  1. Comparable<Rational1>是一个界面。它没有构造函数。您无法实例化它的实例。我认为这是您目前遇到的错误的来源,尽管您没有指明错误是什么。

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

  3. 那就是说,你写的compareTo()方法是荒谬的。你需要思考(或阅读)更多关于理性数字是什么以及如何将两个有理数相互比较。