繁体   English   中英

Java中重写方法的更宽泛的参数类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM