Methods Groovy多方法
我开始学习Methods Groovy多方法,methods,groovy,overloading,Methods,Groovy,Overloading,我开始学习Groovy,并对它的方法调用解析感到好奇。我已经阅读并理解了什么是groovy多方法,但我无法理解下一个代码段的行为 def method(int i) { println 1 } def method(Number n) { println 2 } Number n = 1 method n # returns 1 as expected method((Number) n) # returns 2 which I can't unde
Groovy
,并对它的方法调用解析感到好奇。我已经阅读并理解了什么是groovy多方法,但我无法理解下一个代码段的行为
def method(int i) {
println 1
}
def method(Number n) {
println 2
}
Number n = 1
method n # returns 1 as expected
method((Number) n) # returns 2 which I can't understand why
铸造有什么例外吗?有人能解释一下这种行为吗?我想你在这里看到的是价值输入/输出装箱的结果 如果在中传递actial type
Integer
in的值,则在方法查找期间该值将转换为int
,并调用第一个方法
如果将值显式地强制转换为Number
或其子类,则不会发生inboxing,并调用预期为Number
的方法
我对代码进行了一些扩展:
def method(int i) {
println "int > $i / ${i.getClass()}"
}
def method(Number i) {
println "Number > $i / ${i.getClass()}"
}
def method(float i) {
println "float > $i / ${i.getClass()}"
}
Number n = 1
Number nFloat = 1.0f
Number nDouble = 1.0d
method n
method( new BigInteger( n ) )
method( (Number)n )
method( new BigInteger( n ) as int )
method nFloat
method nDouble
印刷品
int > 1 / class java.lang.Integer
Number > 1 / class java.math.BigInteger
Number > 1 / class java.lang.Integer
int > 1 / class java.lang.Integer
float > 1.0 / class java.lang.Float
Number > 1.0 / class java.lang.Double
希望它现在变得更清晰…这不是自动装箱的问题。它对于非基本类型也是可复制的,在groovy中,默认情况下没有基本类型,我的示例通过
method((Number)n)
明确显示了这一点,您强制使用Number
参数调用method。有没有记录在案?很明显。。。不还有什么逻辑呢?对我来说,这一点并不明显,因为groovy通过对象类确定在运行时调用哪个重载方法。通过执行强制转换,我们不会更改对象类型,您可以将强制转换视为在运行时更改引用类型。您还可以在中看到“否则,在运行时,通过强制转换将操作数值转换为强制转换运算符指定的目标类型(如有必要)。”。在groovy中,也可以使用“as”关键字。Groovy分派方法使用运行时类型调用。