Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Methods Groovy多方法_Methods_Groovy_Overloading - Fatal编程技术网

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分派方法使用运行时类型调用。