![](/img/trans.png)
[英]How can a class in a package use other classes in the same package's static methods?
[英]Can two classes implementing same interface use other class's object as parameter in its common methods?
在接口上的Oracle文档中,有一个非常令人困惑的句子
如果您实现点
Relatable
在各种各样的班,从任何类实例化对象可以与比较findLargerThan()
方法提供的这两个对象是同一类的。
我不确定我是否理解这一点。
假设有一个实现接口Relatable
A
和B
类,我在main()
有一个代码,如下所示。
A a = new A();
B b = new B();
System.out.println(a.isLargerThan(b));
假设isLargerThan()
方法根据接口返回一个int
,以便打印起作用。
以上代码能否适用于任何A类和B类? 我认为这不应该是可能的,因为每个类具有不同的实现,并且很可能是由于在各个类中的isLargerThan()
的实现中isLargerThan()
转换为类的类型。
如果我的上述演绎是正确的,那么在oracle文档中强调任何内容的原因是什么? 这是我混乱的根源。
我知道我应该实现它以确定它是否有效,但由于我是Java的初学者,我的实现本身可能会使它失效。 这就是我在这里问的原因。
如果你的接口方法签名是:
int isLargerThan(Relatable r);
不应该出现问题。
一切都取决于实施。
如果您对A和B的实现适用于接口Relatable
,则不会将其Relatable
转换为特定的实现,也不会使用每个实现的特定属性 - 一切都必须正常。
a.isLargerThan(b)
是否适用于类A
和B
完全取决于A
的实现,它可能会也可能不会尝试将其参数转换为A
强调文档中的任何内容用于指出findLargest
方法可以应用于实现Relatable
的类的任何实例。 但是,它还假设在任何实现类中实现isLargerThan
将始终将参数isLargerThan
转换为实现类。
在此假设下,您可以使用findLargest
将A
与另一个A
或B
与另一个B
,但不能将A
与B
。
是的,它可以适用于任何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”的接口值得一试 - 请参阅例如为什么Java类可以实现可比性?
参数可以是接口。 然后可以使用任何实现该接口的类。
可比较和比较值得关注。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.