我有一个方法需要一个groovy范围,我没有问题传递像
新日期(“01/01/1999”)..新日期(“01/01/1999”)
但我更喜欢传递一个日期(作为Range)
当我打印出来时看起来很不错
范围范围= startDate作为范围
这会显示在控制台中
[Fri Jan 01 00:00:00 CST 1999]
但是现在当我尝试做.get(i)或.getFrom()时,它说不出来
groovy.lang.MissingMethodException: No signature of method: java.util.Date.getFrom() is applicable for argument types: () values: []
Possible solutions: getDate(), getDay(), getTime(), getYear(), before(java.util.Date), getAt(int)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:54)
at org.codehaus.groovy.runtime.InvokerHelper$invokeMethod.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:40)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
at Date_delegateProxy.getFr
任何人都试图在groovy中投射并使用单个日期作为Range?
答案 0 :(得分:2)
在Groovy中,as
运算符调用对象上的asType
方法,并将要转换为它的类作为参数。 DefaultGroovyMethods提供了我所知道的Groovy附带的所有实现,其中没有一个实现转换为Range。
你可以根据需要覆盖asType以支持Range,但是我认为大多数人会考虑滥用运算符重载和这种糟糕的做法,我实际上犹豫不决提供一个例子。尽管如此,这应该是你所要求的。
// Save the original asType method so that it can be called by the overridden one
final f = Date.metaClass.getMetaMethod('asType', [Class] as Class[])
// Replace the default asType method for Date objects
Date.metaClass.asType = { final Class it ->
// For ranges convert the date into a range with the date as both the start
// and end. For other types, use the default implementation of asType
return it == Range? (delegate..delegate) : f.invoke(delegate, it)
}
final start = new Date()
final end = start
assert start..end == start as Range