1

在关于接口的 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

4 回答 4

1

是否a.isLargerThan(b)适用于类A并且B完全取决于 内的实现A,它可能会或可能不会尝试将其参数转换为A.

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

在此假设下,您可以使用findLargest将 aA与另一个A或 aB与另一个进行比较B,但不能将 anA与 a 进行比较B

于 2013-10-20T10:22:04.313 回答
1

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

int isLargerThan(Relatable r);

应该不会出现问题。

一切都取决于实施。

如果您的 A 和 B 的实现可以使用 interface Relatable,则不会将其转换为特定的实现,并且不会使用每个实现的特定属性 - 一切都必须没问题。

于 2013-10-20T10:14:12.913 回答
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
        }
    }

因此,对“任何”的强调正如链接的最后一段所述:“这些方法适用于任何“相关”对象,无论它们的类继承是什么。“。

现在,Relatable 只是一个演示接口的虚构示例。Java 确实有一个名为“Comparable”的接口,值得一试——例如,参见为什么 Java 类应该实现可比较?

于 2013-10-20T10:33:23.590 回答
0

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

可比和比较器值得一看。

于 2013-10-20T10:12:26.643 回答