将def变量传递给Groovy中的类型化BigDecimal参数

时间:2016-03-29 09:17:58

标签: groovy types

我是Groovy的新手,所以我对该语言的运行时绑定,类型化和非类型化属性感到困惑。我个人更喜欢宣布类型。

但是,我有一个问题。

我有一个小方法,从地图,输入,等等,我知道是数字的变量。让我们说我不知道​​初始类型是什么(它在代码的某个深处或来自外部源),另一个是它是一个数字。现在我有一个方法,它接受其中两个参数,我必须对它们进行模运算。因为它们可能是十进制的,所以我使用BigDecimal的其余部分编写了一个小方法,以强制执行我在方法签名上使用类型BigDecimal的类型。

def callerMethod(Map map) {
    ...
    map.each{
        calledMethod(it.val1, it.val2)
        ...
    }
    ...
}

def calledMethod(BigDecimal val1, BigDecimal val2) {
    ...
    vl1.remainder(val2)
    ...
}

这是对的吗?如果传入的参数是Integer(如果我理解正确的话,大多数时候基元被装箱),它是否会被隐式转换或变成BigDecimal?

这在Groovy中是如何工作的。

我仍然认为既然我可以选择使用类型,我想使用它们而不是声明一切def。如果您阅读现有代码,它还可以更容易地阅读代码或查看内容是什么

1 个答案:

答案 0 :(得分:0)

此方法中的问题不是变量的类型,而是每个地图

在一个时髦的地图中,每个都有两个签名。 一个接收参数的Map.Entry和其他接收键和值

例:

Map map = [key1:'value1',key2:'value2']
map.each{ Map.Entry entryMap ->
    println "The value of key: ${entryMap.key} is ${entryMap.value}"
}

每个的结果都是:

The value of key: key1 is value1
The value of key: key2 is value2

或者可能是这样的

Map map = [key1:'value1',key2:'value2']
map.each{ def key, def value ->
    println "The value of key: ${key} is ${value}"
}

第二个结果与第一个结果相同。

如果你想把两个特定的参数传递给你叫做方法,那么把它们传递到每个参数之外:

def callerMethod(Map map) {
    calledMethod(map.val1, map.val2)
}

我不完全理解你想要的东西......我希望能帮助你做代码。