如本答案所述,选择使用哪种重载方法时要遵循规则。
去引用:
- 基本扩展使用可能的最小方法参数
- 包装器类型无法扩展为其他包装器类型
- 您可以将Box从int更改为Integer,然后将其扩展为Object,但不能将其扩展为Long
- 加宽节拍,搏击节拍可变参数。
- 您可以先装箱然后加宽(一个整数可以通过整数变成对象)
- 您不能先加宽然后再框(一个整数不能变长)
- 不能合并VAR-ARGS,有两个加宽和拳击。
(让我们这样重新定义规则1:“原始扩展尽可能使用最具体的方法参数。”)
因此,牢记这些规则,我们可以了解这里发生的情况:
根据第一个规则,原始扩展尽可能使用最具体的方法参数。由于anint由非十进制数表示(例如1),而adouble由十进制数表示,其精度比a float(例如1.0)高32个字节,因此我们可以说ints“小于”或“小于” doubles,并且通过这种逻辑,int可以将s提升为doubles,并且double可以将s提升为ints。
简而言之,可以扩展到另一个原语(例如int-> float-> double)的原语比另一个更具体。例如,一个int是更具体的比double,因为1可以提升1.0。
当您没有向同名的这些重载vararg方法传递任何参数时,由于返回实际上是相同的(分别为0和0.0),因此编译器会选择使用接受类型为vararg的方法,int因为它更具体。
因此,然后,当您引入分别采用ints和booleans的相同方法(不能彼此扩展的类型)时,编译器现在无法选择要使用的方法,因为ints不能像ints一样被“提升”或“降级” ,floats和doubles。因此,它将引发编译错误。
我希望这可以帮助您了解正在发生的事情。