Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可比误差_Java_Eclipse_Comparable - Fatal编程技术网

Java 可比误差

Java 可比误差,java,eclipse,comparable,Java,Eclipse,Comparable,这里是新手问题。我试着自学,有时候单飞路线会令人沮丧。在Liang的《Java编程入门》第8版(练习14.1)中,我遇到了一个问题,我必须修改GeometricObject类以实现Comparable,然后定义一个静态“max”方法来查找两个GeometricObject中较大的一个。然后我必须编写一个测试程序,使用这个max方法来找到两个矩形中较大的一个。在本书之前,作者让我们创建了一个扩展GeometricObject的矩形子类。我修改了GeometricObject类以实现Comparab

这里是新手问题。我试着自学,有时候单飞路线会令人沮丧。在Liang的《Java编程入门》第8版(练习14.1)中,我遇到了一个问题,我必须修改GeometricObject类以实现Comparable,然后定义一个静态“max”方法来查找两个GeometricObject中较大的一个。然后我必须编写一个测试程序,使用这个max方法来找到两个矩形中较大的一个。在本书之前,作者让我们创建了一个扩展GeometricObject的矩形子类。我修改了GeometricObject类以实现Comparable,并创建了max方法。然后我修改了Rectangle子类以实现Comparable。我也写了测试程序

但是Eclipse通过我的矩形类的声明给了我一个大的红色X,声明“接口Comparable不能用不同的参数实现多次:Comparable和Comparable”。这时我的类声明如下所示:

public class Rectangle extends GeometricObject implements Comparable<Rectangle> {
。。。并且错误消息更改为“Comparable是原始类型。对泛型类型Comparable的引用应参数化”。此外,在这种情况下,它还添加了第二个错误:“类型矩形必须实现继承的抽象方法Comparable。compareTo(对象)”

当我看这类声明的例子时,它们似乎总是使用类名作为声明中Comparable的参数,事实上,这就是书中所说的。那为什么它说我不能在这里这么做

那么关于compareTo()方法的第二个错误呢?为什么只有在我从声明中删除参数时才指出它?矩形类的代码如下(如果需要,我也可以发布GeometricObject超类):

public类矩形扩展GeometricObject{
私人双宽度;
私人双高;
公共矩形(){
}
公共矩形(双宽双高){
这个。宽度=宽度;
高度=高度;
}
公共矩形(双宽、双高、字符串颜色、布尔填充){
这个。宽度=宽度;
高度=高度;
设置颜色(颜色);
设置填充(填充);
}
公共双getWidth(){
返回宽度;
}
公共空白设置宽度(双倍宽度){
这个。宽度=宽度;
}
公众双倍身高(){
返回高度;
}
公共空间设置高度(双倍高度){
高度=高度;
}
公共区域(){
返回宽度*高度;
}
公共双边界{
返回2*(宽度+高度);
}
/**实施Comparable中定义的compareTo方法*/
公共整数比较(矩形o){
if(getArea()>((矩形)o).getArea())
返回1;
else if(getArea()<((矩形)o).getArea())
返回-1;
其他的
返回0;
}
}

由于父类几何对象已经实现了Comparable,因此无需在基类“Rectangle”中再次实现相同的几何对象

您的基类应该如下所示

public类矩形扩展了geometricObject{
}


因为geometricObject实现了Comparable,所以即使矩形类也实现了Comparable。您只需重写rectangle类中的compareTo()方法,即可使用max方法进行比较。

是的,这有点棘手,可能会让人困惑

当您将GeometricObject声明为可比较时,这意味着每个GeometricObject都可以与另一个GeometricObject进行比较-因此您可以对GeometricObject列表进行排序(可能是它的子类实例,因为它可能是抽象的)。 因此,当您在GeometricObject中实现Compariable时,您需要实现以下功能:

public int compareTo(GeometricObject o) {}
public int compareTo(Rectangle o) {}
在这一点上,当使用矩形-矩形自动派生扩展GeometricObject时,它的超级类compareTo方法。在矩形中实现Comparable时,您需要实现此功能:

public int compareTo(GeometricObject o) {}
public int compareTo(Rectangle o) {}
这似乎没有问题,因为这似乎是一个常规重载,但这里是catch-泛型在Java中,它只是编译器的一个语法糖-在运行时,所有泛型都成为对象,所以编译后矩形将包含两个相同的方法


因此,您只能选择一个,尽管我们以您的用例为例,它可能没问题-您只能在超级类中实现Comparable,在矩形中覆盖它,并检查它是否是矩形的实例,执行您的特定逻辑或使用超级类逻辑。

GeometricObject
上有哪些属性/方法可用?我认为这样做的想法是,您只在
GeometricObject
本身上实现
Comparable
,这样所有子类都应该可以正常工作。哎哟。第一个错误实际上是“不能使用不同的参数多次实现接口Comparable:Comparable和Comparable”GeometricObject是否实现Comparable?请参见示例。公共抽象类GeometricObject实现Comparable{private String color=“white”;private boolean filled;private java.util.Date created;……后面还有更多代码..好的,所以我从矩形对象中删除了Comparable的实现。在程序结束时,我重写了compareTo()方法。但它没有确认我已经这样做了。Eclipse正在用一个错误标记我的类声明,该错误告诉我必须重写compareTo()。我是否错误地重写了它?快速提示:对于这种情况,可以使用Eclipe的“快速修复”功能:将光标放在类名上(Eclipse将用红色虚线标记它),然后在Windows上按CTRL+1或在OSX上按CMD+1。Eclispe将显示一个带有几个建议的弹出窗口(取决于错误的类型)。在您的情况下,您应该选择“添加未实现的方法”。Eclipse将添加缺少的方法你可以检查他们的签名和你自己写的有什么不同。也许这对t