我一直在阅读有关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)
,以便解释我们实际上正在比较的内容(只有“较大”才是比较流行的)。