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