问题描述
在Java,如果有两个函数如下:voidf(Integeri){}voidf(Floatf){}
如果调用f(1),JVM知道去调用第一个函数但是如果换成是下面两个函数voidf(Integer...args){}voidf(Float...args){}
这时如果调用f(1),javac爆函数歧义但是如果再次换成下面两个函数voidf(Integer...args){}voidf(Object..args){}
这时调用f(1),就可以正常调用第一个函数或者换成下面两个函数voidf(Integer...args){}voidf(Integeri){}
这时调用f(1),也会调用第二个函数。因为Java中函数的唯一签名可以认为是函数名+参数列表求问哪位大神可以对这些现象来解释一下
解决方案
解决方案二:
这是Java中对重载概念的理解:首先重载在Java方法调用中称之为静态分派(重写为动态分派),其次静态分派发生在编译阶段!也就是说重载是编译器帮你抉择好调用方法的版本的,那么编译器是根据什么选择版本呢?通常就是根据传入变量的静态类型(比如:Humana=newMan(),对象a的静态类型是Human,而Man则是实际类型),还有一个值得注意的问题就是这种可选择的版本有时候不是唯一的,出现的原因就像本例子中直接输入字面量f(1),而没有明确声明它的静态类型,这种情况那么编译器就会根据语言上的规则和理解去自动帮你选择“更合适的”方法,1和integer自然最贴切。楼主可以尝试注释一些方法和再加一些重载方法测试一下静态分派编译器的自动选择。。
解决方案三:
引用1楼kk_124的回复:
这是Java中对重载概念的理解:首先重载在Java方法调用中称之为静态分派(重写为动态分派),其次静态分派发生在编译阶段!也就是说重载是编译器帮你抉择好调用方法的版本的,那么编译器是根据什么选择版本呢?通常就是根据传入变量的静态类型(比如:Humana=newMan(),对象a的静态类型是Human,而Man则是实际类型),还有一个值得注意的问题就是这种可选择的版本有时候不是唯一的,出现的原因就像本例子中直接输入字面量f(1),而没有明确声明它的静态类型,这种情况那么编译器就会根据语言上的规则和理解去自动帮你选择“更合适的”方法,1和integer自然最贴切。楼主可以尝试注释一些方法和再加一些重载方法测试一下静态分派编译器的自动选择。。
静态分派进行方法抉择的机制,请问一下你了解吗?
解决方案四:
引用2楼phelovhl的回复:
Quote: 引用1楼kk_124的回复:
这是Java中对重载概念的理解:首先重载在Java方法调用中称之为静态分派(重写为动态分派),其次静态分派发生在编译阶段!也就是说重载是编译器帮你抉择好调用方法的版本的,那么编译器是根据什么选择版本呢?通常就是根据传入变量的静态类型(比如:Humana=newMan(),对象a的静态类型是Human,而Man则是实际类型),还有一个值得注意的问题就是这种可选择的版本有时候不是唯一的,出现的原因就像本例子中直接输入字面量f(1),而没有明确声明它的静态类型,这种情况那么编译器就会根据语言上的规则和理解去自动帮你选择“更合适的”方法,1和integer自然最贴切。楼主可以尝试注释一些方法和再加一些重载方法测试一下静态分派编译器的自动选择。。静态分派进行方法抉择的机制,请问一下你了解吗?
他有个优先级。。具体的楼主可以去网上查一查,我记得变长参数优先级是最低的。这个概念楼主知道一下就可以了,因为我实际编程中绝对不会(要)出现这种模棱两可的重载方式~
解决方案五:
引用3楼kk_124的回复:
Quote: 引用2楼phelovhl的回复:
Quote: 引用1楼kk_124的回复:
这是Java中对重载概念的理解:首先重载在Java方法调用中称之为静态分派(重写为动态分派),其次静态分派发生在编译阶段!也就是说重载是编译器帮你抉择好调用方法的版本的,那么编译器是根据什么选择版本呢?通常就是根据传入变量的静态类型(比如:Humana=newMan(),对象a的静态类型是Human,而Man则是实际类型),还有一个值得注意的问题就是这种可选择的版本有时候不是唯一的,出现的原因就像本例子中直接输入字面量f(1),而没有明确声明它的静态类型,这种情况那么编译器就会根据语言上的规则和理解去自动帮你选择“更合适的”方法,1和integer自然最贴切。楼主可以尝试注释一些方法和再加一些重载方法测试一下静态分派编译器的自动选择。。静态分派进行方法抉择的机制,请问一下你了解吗?
他有个优先级。。具体的楼主可以去网上查一查,我记得变长参数优先级是最低的。这个概念楼主知道一下就可以了,因为我实际编程中绝对不会(要)出现这种模棱两可的重载方式~
是的,我是在看ThinkinginJava的时候看到的,平时编码过程中不会使用。这个是偏语言本身方面的东西