当我从一个扩展特定接口的 class 创建一个对象时,我可以在我使用这个接口的地方使用这个对象吗?

When I create an object from a class that extends a specific interface, can I use this object in the place where I use this interface?

我知道我可以传递一个 interface 作为参数。因为我们不能从 interface!我可以从 class 创建一个对象 extends 这个 interface 然后我在我使用这个 interface 作为参数的地方使用这个对象吗?

我的问题是,由于 obj 是来自 Final class 的对象,我可以在此处将其用作参数 (m1(obj)) 吗?请向我解释为什么?

package aaa;

public class AAA {
    public static void m1(One one) {
      System.out.print("AAA");
    }

    public static void main(String[] args) {
      Final obj = new Final();
      m1(obj);
    }
}

interface One {
}

class Final  implements One {
}

是的,你可以做到。 接口是 Java 中避免多重继承的一种方式,即声明 class Foo 扩展 class Bar 并实现接口 Bar意味着我们在 FooBar/Baz 之间有一个 "is a" 关系。因此,“FooBar”和“FooBaz”是正确的,或者在您的情况下 FinalOne。因此,如果类型是子类型(或在 Java 中实现接口),则可以使用子类型代替类型或接口(参见 Liskov 替换原则)。

当你声明一个方法 m1(One one) 时,你需要第一个参数是 One 类型,因为 Final 是一个 One 这显然是正确的。

请注意,即使您传入类型为 Final 的对象,该方法也只是 "sees" 对象的接口部分,而没有转换它。