[英]Wider argument types of overridding method in Java
以下代码打破了OO原则? 不是Java OO原则而是一般OO原则。
class GeneralArg{}
class Arg extends GeneralArg{}
class A{
public void test(Arg a){}
}
class B extends A{
@Override
public void test(GeneralArg a){}
}
我认为这应该有效!
但是有一个编译错误,说B.test()
不会覆盖B.test()
A.test()
声明1:每个GeneralArg都不是Arg。
测试的基本定义是: test()
将Arg
作为输入。
B的定义是: 相同的test()
应该将GeneralArg
作为输入。 但鉴于声明1,这是不可能的。
@Override表示您正在重写基类的定义。
总而言之, B.test()
A.test()
和B.test()
不是相同的方法( different signatures
),因此一个不能覆盖另一个。
这不违反任何OO原则。 它只是更改方法签名,而这正是方法被识别的一件事。 因此,编译器没有意识到您的意图是扩展超级方法的参数类型。
Liskov替代原则允许您要做的事情,Java只是不支持这种方式。
你正在做的不是压倒性而是超载。
当您更改参数列表时,您将重载方法。 您在更改实现时覆盖方法。
public class Foo {
public void method1() {
}
public void method1(String str) {
//We overload method1
}
}
public class Bar extends Foo {
public void method1(String str) {
// We override method1 here
}
public void method1(Number num) {
// We overload method1 here
}
}
注意,注释不是强制性的,它仅通知编译器您已重写某些方法以防止潜在的错误。
结束当你在子类声明方法时使用相同的[签名]覆盖它时,当你添加/删除switch参数顺序时你会重载。 由于每个非最终方法都是虚拟的,因此可以遵循Java规则。
不,它不应该!
通过使用Override
注释方法,您说它会覆盖某些内容,但不会覆盖某些内容。
在Java中,方法是在编译时解析和绑定的。 这意味着将检查声明的参数类型并选择一种方法。 此时,参数类型的继承并不重要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.