繁体   English   中英

实现相同接口的两个类可以在其常用方法中使用其他类的对象作为参数吗?

[英]Can two classes implementing same interface use other class's object as parameter in its common methods?

接口上的Oracle文档中,有一个非常令人困惑的句子

如果您实现点Relatable在各种各样的班,从任何类实例化对象可以与比较findLargerThan()方法提供的这两个对象是同一类的。

我不确定我是否理解这一点。

假设有一个实现接口Relatable AB类,我在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)是否适用于类AB完全取决于A的实现,它可能会也可能不会尝试将其参数转换为A

强调文档中的任何内容用于指出findLargest方法可以应用于实现Relatable的类的任何实例。 但是,它还假设在任何实现类中实现isLargerThan将始终将参数isLargerThan转换为实现类。

在此假设下,您可以使用findLargestA与另一个AB与另一个B ,但不能将AB

是的,它可以适用于任何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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM