我可以在groovy中的单个日期范围内调用get(i)或getFrom()吗?

时间:2011-07-26 18:53:13

标签: date groovy range

我有一个方法需要一个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?

1 个答案:

答案 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