假设你有一个名为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>();
}
}
答案 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)
Comparable<Rational1>
是一个界面。它没有构造函数。您无法实例化它的实例。我认为这是您目前遇到的错误的来源,尽管您没有指明错误是什么。
从问题描述(第一段)开始,我们根本不清楚您在main()
尝试做什么。您的主要目标是为您已完成的compareTo()
方法编写定义。
那就是说,你写的compareTo()
方法是荒谬的。你需要思考(或阅读)更多关于理性数字是什么以及如何将两个有理数相互比较。