【发布时间】:2014-04-16 04:51:59
【问题描述】:
我想允许用户使用BigDecimal 和String 在我的类中设置BigDecimal 属性(出于向后兼容性的原因)。
extension.timeoutFactor = 1.81
extension.timeoutFactor = "2.12"
它尝试使用两个具有不同参数类型的setter:
class PitestPluginExtension {
BigDecimal timeoutFactor
void setTimeoutFactor(BigDecimal timeoutFactor) {
this.timeoutFactor = timeoutFactor
}
@Deprecated
void setTimeoutFactor(String timeoutFactor) {
//display deprecation warning
this.timeoutFactor = timeoutFactor.toBigDecimal()
}
}
但是 Groovy 失败了:
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object
'2.12' with class 'java.lang.String' to class 'java.math.BigDecimal'
如果直接调用 setter,一切正常,但这是 Gradle plugin,人们习惯使用属性分配。
是否可以告诉 Groovy (1.8.6) 在属性分配上使用不同的输入类型(最好不使用 Groovy 元编程)?
【问题讨论】:
-
为什么不用元编程?
-
@WillP,扩展类由 Gradle 管理(请参阅配置 example),并且在此类上执行的内部 Gradle 魔术可能(可能)存在一些问题。因此,我更喜欢使用“标准”方法的明确解决方案(例如具有不同参数类型的设置器 - 不幸的是,这不起作用)。然而,如果在 Groovy 中它不是“可能的”,那么使用元编程的(工作)解决方案也可以。
标签: groovy