2011-11-07 75 views
1
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); 
    }  

} 

Rectangle类

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 
+1

什么是“可比较”界面,您是否自己创建它?如果是这样,你不应该,已经在stdlib – pajton

回答

3

更改线路

public abstract class GeometricObject implements Comparable { 

public abstract class GeometricObject implements Comparable<GeometricObject> { 

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

+0

有'Comparable'接口建议更改后...线程“main”中的异常java.lang.ClassCastException:geometricobject.Circle不能转换为geometricobject.GeometricObject $可比较 at geometryobject.GeometricObject.max(GeometricObject.java:61) at geometricobject.GeometricObject.main(GeometricObject.java:52) Java结果:1 – MISMajorDeveloperAnyways

+0

为什么你有自己的Comparable实现? –

+0

它是由我在课堂上做的任务指定的,我需要实现Comparable并声明compareTo。 Comparable接口声明是不必要的? – MISMajorDeveloperAnyways

2

它总是好的使用@Override无论何时执行或重写某种方法。

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

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