类型转换和继承

时间:2013-02-11 15:32:55

标签: groovy casting

给出类似

的课程
class MyDate extends java.util.Date {
   //add some functionality
}

您创建了自己的Date对象,该对象继承了所有功能。

但是如果您尝试使用此功能

MyDate d = MyDate.parse('yyyy','2013')

您将遇到一个问题,即解析方法将返回java.util.Date,而MyDate无法投放到asType()

你可以通过Date()功能编写自己的演员阵容,但这没有用,因为你必须将它添加到{{1}}类(我知道这是可能的,但我想避免它。)

有没有其他方法可以解决这个问题?

4 个答案:

答案 0 :(得分:3)

Groovy的Date.parse方法将返回Date对象。如果你想要它返回你的MyDate对象,你必须写它(覆盖,但仍然使用超级):

@groovy.transform.InheritConstructors class MyDate extends java.util.Date {
  static MyDate parse(String format, String date) {
    new MyDate( Date.parse(format, date).time )
  }

  String formated() {
    format 'dd/MM/yyyy'
  }
}

MyDate d = MyDate.parse('yyyy-MM-dd','2013-09-03')

assert d.formated() == "03/09/2013"

您还需要继承构造函数(通过这个groovy变换)或编写自己的构造函数。

答案 1 :(得分:1)

Ralf,您正在尝试继承一个静态方法,就好像它是一个实例方法一样。这不起作用。做一个:

Date date = MyDate.parse(....) 

会工作,但我不推荐它,因为它令人困惑:似乎解析方法在MyDate上,但实际上你仍然在调用Date的静态解析方法。

可替换地。你可以在你的MyDate类上实现parse方法,让那个parse方法返回一个MyDate类。

答案 2 :(得分:0)

对象的解析方法Date(不建议使用)不返回Date对象而是返回静态long。也许你的意思是SimpleDateFormat?

无论如何,在这种情况下你必须重载你需要的方法。

答案 3 :(得分:0)

我认为你可以这样做:

MyDate d = (MyDate)Date.parse('yyyy','2013'); //tell me if i'm wrong but i'm pretty sure i'm not

然后将MyDate类中缺少的成员添加到新返回的对象中。