我一直在阅读有关Java接口的信息。总的来说,我理解这个概念,除了一个问题。在http://goo.gl/l5r69(docs.oracle)中,在注释中写道,我们可以键入强制转换接口和实现该接口的类。那是

public interface Relatable {
    public int isLargerThan (Relatable other) ;
}

public class RectanglePlus implements Relatable {
    public int width = 0;
    public int height = 0;
    public Point origin;

    // four constructors
    // ...

    // a method for computing the area of the rectangle
    public int getArea() {
        return width * height;
    }

    // a method required to implement the Relatable interface
    public int isLargerThan(Relatable other) {
        RectanglePlus otherRect = (RectanglePlus) other;

        if (this.getArea() < otherRect.getArea()) {
            return -1;
        } else if (this.getArea () > otherRect.getArea()) {
            return 1;
        } else {
            return 0;
        }
    }
}


如何将otherRect(这是一个接口)强制转换为RectanglePlus。令人困惑的是,RectanglePlus是具有变量的类,该变量在作为接口的otherRect中不存在

最佳答案

我必须承认,您显示的Java文档中的示例简直是糟糕且令人困惑。
这很糟糕,因为它包含不安全的向下层次结构。
强制转换(从实现类到接口/超类)始终是安全的,但应尽可能避免强制转换。

理想情况下,Relatable接口还应包含getArea()方法:

public interface Relatable {
    public int isLargerThan(Relatable other);
    public int getArea();
}


现在,您不需要丑陋的演员表,只需:

public int isLargerThan(Relatable other) {
    if (this.getArea() < other.getArea()) {
        return -1;
    } else if (this.getArea () > other.getArea()) {
        return 1;
    } else {
        return 0;
    }
}


足够。我还认为isLargerThan(Relatable other)是一个坏名字(在什么方面更大?)。它可能应该类似于hasBiggerArea(Relatable other),以便解释我们实际上正在比较的内容(只有“较大”才是比较流行的)。

09-05 08:51