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

时间:2013-10-20 09:55:45

标签: java interface

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

  

如果您要在各种类中实现Relatable,那么可以将从这些类的任何实例化的对象与提供的findLargerThan()方法进行比较两个对象属于同一类。

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

假设有一个类AB实现了接口Relatable,我在main()中有一个代码,如下所示。

A a = new A();
B b = new B();

System.out.println(a.isLargerThan(b));

假设isLargerThan()方法根据接口返回int,以便打印工作。

  • 上述代码能否适用于任何A类和B类?我认为这不应该是可能的,因为每个类具有不同的实现,并且很可能是由于在各个类的isLargerThan()的实现中强制转换为类的类型。

  • 如果我的上述扣除是正确的,那么在oracle文档中强调任何的原因是什么?这是我的困惑之源。

我知道我应该实现它以确定它是否有效但是因为我是Java的初学者,我的实现本身可能会使它失效。这就是我在这里问的原因。

4 个答案:

答案 0 :(得分:1)

如果你的接口方法签名是:

int isLargerThan(Relatable r);

不应该出现问题。

一切都取决于实施。

如果A和B的实现适用于接口Relatable,则不会将其强制转换为特定的实现,也不会使用每个实现的特定属性 - 一切都必须正常。

答案 1 :(得分:1)

a.isLargerThan(b)适用于班级AB是否完全取决于A中的实施,这可能会也可能不会尝试将其参数投射到{{1} }}。

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

根据此假设,您可以使用isLargerThanfindLargest与另一个AA与另一个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)

参数可以是接口。然后可以使用任何实现此接口的类。

可比较和比较值得看。