Java 实现同一接口的两个类是否可以使用其他类';s对象作为其常用方法中的参数?
在甲骨文文档中,有一个非常令人困惑的句子 如果要在各种各样的类中实现Java 实现同一接口的两个类是否可以使用其他类';s对象作为其常用方法中的参数?,java,interface,Java,Interface,在甲骨文文档中,有一个非常令人困惑的句子 如果要在各种各样的类中实现Relatable,则可以将从这些类中实例化的对象与findLargerThan()方法进行比较,前提是这两个对象属于同一类 我不确定我是否理解这一点 假设有一个类a和B实现接口Relatable,我在main()中有一个代码,如下所示 A a = new A(); B b = new B(); System.out.println(a.isLargerThan(b)); 假设isLargerThan()方法根据接口返回一个
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文档中强调any的原因是什么?这是我困惑的根源
我知道我应该实现它,看看它是否有效,但由于我是Java的初学者,我的实现本身可能会使它不起作用。这就是我在这里问它的原因。参数可以是接口。然后可以使用实现该接口的任何类
可比较的和可比较的,值得一看。如果您的接口方法签名是:
int isLargerThan(Relatable r);
不应该出现问题
一切都取决于执行情况
如果A和B的实现与interface
Relatable一起工作,则不会将其强制转换为特定的实现,也不会使用每个实现的特定属性-一切都必须正常。是否A.isLargerThan(B)
适用于类A
,而B
完全取决于A
中的实现,后者可能会也可能不会尝试将其参数强制转换为A
文档中对any的强调是用来指出findLargest
方法可以应用于实现Relatable
的类的任何实例。但是,它还假设任何实现类中的的实现都比的实现更大,总是将参数强制转换为实现类
在此假设下,您可以使用findLargest
将A
与另一A
或B
与另一B
进行比较,但不能使用A
与B进行比较是的,它可以适用于任何A和B(实现可关联的),但需要注意的是,当A实现更大时,它必须知道类型,从而知道比较的基础
例如,假设A是类卡车,B是类汽车,A和B都实现了可关联性
当比较一辆卡车和另一辆卡车时,我们希望比较的基础是载重能力。然而,当与汽车进行比较时,我们希望它能根据马力进行比较
因此,A的Islarger方法可以是:
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”对象,无论它们的类继承是什么。”
现在,Relatable只是一个演示接口的虚构示例。Java确实有一个名为“Comparable”的接口,值得一试——例如,请参见,只要isLargerThan被定义为接受可拆分对象,这意味着在进行比较时,您只能从接口和接口方法访问静态最终字段。Upvote指出文档正在进行假设。