正如您可能已经理解的那样,正式解释是这两个函数具有不同的签名(正如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的对象的指针.