【问题标题】:implementing Comparable interface from abstract class with concrete subclasses从具有具体子类的抽象类实现 Comparable 接口
【发布时间】:2011-12-23 19:13:32
【问题描述】:
package geometricobject;

public abstract class GeometricObject implements Comparable {
private String color = "white";
private boolean filled;
private java.util.Date dateCreated;

protected GeometricObject(){
    dateCreated = new java.util.Date();
}

protected GeometricObject(String color, boolean filled){
    dateCreated = new java.util.Date();
    this.color = color;
    this.filled = filled;
}

public String getColor(){
    return color;
}

public void setColor(String color){
    this.color = color;
}

public boolean isFilled(){
    return filled;
}

public void setFilled(boolean filled){
    this.filled = filled;
}

public java.util.Date getDateCreated() {
    return dateCreated;
}

public String toString() {
    return "Created on " + dateCreated + "\ncolor: " + color + 
            "and filled: " + filled;
}

public static void main(String[] args) {
    GeometricObject circle1 = new Circle(1, "Red", true);
    GeometricObject circle2 = new Circle(2, "Blue", false);
    GeometricObject maxCircle = new Circle();
    GeometricObject rect1 = new Rectangle(1, 1, "Red", true);
    GeometricObject rect2 = new Rectangle(2, 2, "Blue", false);
    GeometricObject maxRect = new Rectangle();

    maxCircle = GeometricObject.max(circle1, circle2);
    maxRect = GeometricObject.max(rect1, rect2);

    System.out.println(maxCircle.toString());
    System.out.println(maxRect.toString());

}

public static GeometricObject max (GeometricObject o1, GeometricObject o2){
    if (((Comparable)o1).compareTo(o2) > 0 )
         return o1;
    else
         return o2;
}

public interface Comparable {
        public int compareTo(GeometricObject o);
    }

public int compareTo(GeometricObject o) {
        if (this.getArea() > o.getArea())
            return 1;
        else if (this.getArea() < o.getArea())
            return -1;
        else 
            return 0;
    }

    public abstract double getArea();

}

CIRCLE 类

class Circle extends GeometricObject {
    private double radius;

    public Circle() {
    }

    public Circle(double radius){
        this.radius = radius;
    }

    public Circle(double radius, String color, boolean filled){
        this.radius = radius;
        setColor(color);
        setFilled(filled);
    }

    public double getRadius(){
        return radius;
    }

    public void setRadius(double radius){
        this.radius = radius;
    }

    public double getArea(){
        return radius * radius * Math.PI;
    }

    public double getDiameter(){
        return 2 * radius;
    }

    public double getPerimeter(){
        return 2 * radius * Math.PI;
    }

    public void printCircle() {
        System.out.println("The circle is created " + getDateCreated() +
            " and the radius is " + radius);
    }    

}

矩形类

class Rectangle extends GeometricObject {
    private double width;
    private double height;

    public Rectangle() {
    }

    public Rectangle(double Width, double Height){
        this.width = Width;
        this.height = Height;
    }

    public Rectangle(double Width, double Height, String Color, boolean Filled){
        this.width = Width;
        this.height = Height;
        setColor(Color);
        setFilled(Filled);
    }

    public double getWidth(){
        return width;
    }

    public double getHeight(){
        return height;
    }

    public void setHeight(double Height){
        this.height = Height;
    }

    public double getArea(){
        return width * height;
    }

    public double getPerimeter(){
        return 2 * (width + height);
    }        
}

所以我尝试做这个单独的类并不断得到这个错误。

Exception in thread "main" java.lang.ExceptionInInitializerError
        at geometricobject.GeometricObject.main(GeometricObject.java:44)
Caused by: java.lang.RuntimeException: Uncompilable source code - geometricobject.Circle is not abstract and does not override abstract method compareTo(java.lang.Object) in java.lang.Comparable
        at geometricobject.Circle.<clinit>(Circle.java:12)
        ... 1 more
Java Result: 1

【问题讨论】:

  • 这个Comparable接口是什么,是你自己创建的吗?如果是这样,你不应该,stdlib 中已经有Comparable 接口

标签: java interface comparable implements


【解决方案1】:

换行

public abstract class GeometricObject implements Comparable {

public abstract class GeometricObject implements Comparable<GeometricObject> {

没有泛型,你需要实现的方法是compareTo(Object),而不是compareTo(GeometricObject)

【讨论】:

  • 建议更改后...线程“main”中的异常 java.lang.ClassCastException:geometricobject.Circle 无法在 geometryobject.GeometricObject.max(GeometricObject.java:61 ) 在geometricobject.GeometricObject.main(GeometricObject.java:52) Java 结果:1
  • 为什么有自己的 Comparable 实现?
  • 它是由我在课堂上做的作业指定的,我需要实现 Comparable,并声明一个 compareTo。是否不需要 Comparable 接口声明?
  • 对,您需要实现 Comparable(您在 GeometricObject 中执行此操作),但您不需要自己定义 Comparable。
【解决方案2】:

在实现或覆盖某些方法时使用@Override 注释总是很好。

public abstract class GeometricObject implements java.lang.Comparable<GeometricObject> {

    @Override
    public int compareTo(GeometricObject o) {
        int result = 0;
        //do comparision
        return result;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2016-08-13
    相关资源
    最近更新 更多