在interfaces上的Oracle文档中,有一个非常令人困惑的句子
如果您要在各种类中实现
Relatable
,那么可以将从这些类的任何实例化的对象与提供的findLargerThan()
方法进行比较两个对象属于同一类。
我不确定我是否理解这一点。
假设有一个类A
和B
实现了接口Relatable
,我在main()
中有一个代码,如下所示。
A a = new A();
B b = new B();
System.out.println(a.isLargerThan(b));
假设isLargerThan()
方法根据接口返回int
,以便打印工作。
上述代码能否适用于任何A类和B类?我认为这不应该是可能的,因为每个类具有不同的实现,并且很可能是由于在各个类的isLargerThan()
的实现中强制转换为类的类型。
如果我的上述扣除是正确的,那么在oracle文档中强调任何的原因是什么?这是我的困惑之源。
我知道我应该实现它以确定它是否有效但是因为我是Java的初学者,我的实现本身可能会使它失效。这就是我在这里问的原因。
答案 0 :(得分:1)
如果你的接口方法签名是:
int isLargerThan(Relatable r);
不应该出现问题。
一切都取决于实施。
如果A和B的实现适用于接口Relatable
,则不会将其强制转换为特定的实现,也不会使用每个实现的特定属性 - 一切都必须正常。
答案 1 :(得分:1)
a.isLargerThan(b)
适用于班级A
和B
是否完全取决于A
中的实施,这可能会也可能不会尝试将其参数投射到{{1} }}。
强调文档中的任何用于指出A
方法可以应用于实现findLargest
的类的任何实例。但是,它还假设在任何实现类中Relatable
的实现总是将参数强制转换为实现类。
根据此假设,您可以使用isLargerThan
将findLargest
与另一个A
或A
与另一个B
进行比较,而不是B
1}}与A
。
答案 2 :(得分:1)
是的,它适用于任何A和B(实现Relatable),但需要注意的是,当A实现isLargerThan时,它必须知道类型 - 因此也就是比较的基础。
例如,假设A是类Truck,B是Car类,A和B都实现了Relatable。
当比较一辆卡车与另一辆卡车时,我们希望比较的基础是负载能力。但是,在与汽车进行比较时,我们希望它能够根据马力进行比较。
所以,A的isLargerThan方法可能是这样的:
public class Truck implements Relatable {
private int capacity;
private int horsepower;
public int isLargerThan(Relatable other) {
if (other instanceof Truck) {
Truck otherTruck = (Truck)other;
return Integer.signum(capacity - otherTruck.capacity);
} else if (other instanceof Car) {
Car otherCar = (Car)other;
return Integer.signum(horsepower - otherCar.getHorsepower());
} else {
// Maybe throw exception
}
}
所以对“any”的强调如你链接的最后一段所述:“这些方法适用于任何”可关联的“对象,无论它们的类继承是什么。”。
现在,Relatable只是一个演示界面的示例。 Java确实有一个名为“Comparable”的界面,值得一试 - 例如参见Why should a Java class implement comparable?
答案 3 :(得分:0)
参数可以是接口。然后可以使用任何实现此接口的类。
可比较和比较值得看。