我的理解是,当您说Alpha a = new Beta();时,编译器会检查Alpha.foo,但是JVM实际上会运行Beta.foo。首先,Beta有一个foo方法,其签名与调用匹配。另一方面,我认为varargs方法只在没有匹配调用的其他方法时才运行。这就是我认为不应该运行Alpha.foo的两个原因。这种理解的哪一部分是错误的?
谢谢!我认为在SuperClass sc = new SubClass();情况下,在sc上调用的任何方法都将在运行时
value) {}
public function foo(PrimitiveValue $value) {}
注意,基类A接受子类StringValue作为参数类型,子类B接受父类PrimitiveValue。根据我的理解,类B中的foo()方法接受父方法接受的任何东西,加上更多,因为它接受基本类型PrimitiveValue。因此,任何只看到A类的调用者都传递可以由B处理的值,而不违反LSP。知道它是B的呼叫者可以做出更强