java重写方法的参数类型,java – 为什么不允许在重写方法中使用参数类型(一个是原始的而另一个是包装器)的区别?...

正如您可能已经理解的那样,正式解释是这两个函数具有不同的签名(正如Andrew Tobilko已经指出的那样),因此可能无法覆盖另一个.

因此,我认为通过提出这个问题,你真正要问的是“为什么会这样”,或者“为什么编译器无法解决问题以便让我这样做”.

所以,实际的解释如下:

这是因为你可能在某个地方(某些不相关的类甚至)接受一个SuperClass作为参数,并试图像这样调用它的method1():

public void someMethod( SuperClass s )

{

s.method1( 7 );

}

当编译器找到它时,它会将7作为参数传递给method1(),它不会传递一个包装的7.但是,s可能不是SuperClass的实例,它可能是SubClass的一个实例,如下所示:

/* some code somewhere */

someMethod( new SubClass() );

if S is a subtype of T, then objects of type T may be replaced with objects of type S (i.e., objects of type S may substitute objects of type T) without altering any of the desirable properties of that program (correctness, task performed, etc.).

这是相同的原则,允许您将新的ArrayList< String>()分配给List< String>类型的变量,如果没有它,在OOP中什么都不会起作用.

因此,编译器必须传递一个简单的原语7,但SubClass的接收方法将期望一个包装7,这是行不通的.因此,该语言规定这种隐式转换是无效的,以确保不会出现这种无意义的情况.

修订

你可能会问,“为什么它不起作用?”答案是java中的原语对应于底层硬件的机器数据类型,而包裹的原语是对象.因此,在机器堆栈上,7将由值为7的机器字表示,而包裹的7将由0x46d7c8fe表示,这将是指向包含包装7的对象的指针.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值