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指出文档正在进行假设。