2009-05-31 106 views
2

我希望有一个很好的方式来获得一个Java Date对象的当前Unix的时间戳,这是我的解决方案:的Java类型转换和继承

public class Date extends java.util.Date { 

    public int getUnixTimeStamp() { 
     int unixtimestamp = (int) (this.getTime() * .001); 
     return unixtimestamp; 
    } 
} 

这工作正常,但问题是当我尝试投了Java的Date对象,以我的自定义日期类,即:

Calendar foo = Calendar.getInstance(); 
foo.set(0, 0, 0, 12, 30); 
myapp.Date foo2 = (myapp.Date)foo.getTime(); 

这生成:异常在线程 “主要” java.lang.ClassCastException:java.util.Date不能转换到myapp.Date

我理解为什么会产生这个异常,但有什么办法将超类转换为子类?如果不是,你将如何实现unixtimestamp方法?我经常在我的应用程序中使用它。

回答

3

您不能在子类中强制转换超类,因为子类可能具有比超类更大的接口,这意味着子类可以具有超类没有的函数,如getUnixTimeStamp()。在你的例子中,这意味着你试图在java.util.Date上调用getUnixTimeStamp。

您可以在此处使用委托或组合代替继承。

这意味着你有一个类

public class Date { 

    private java.util.date date; 

    public Date(java.util.Date date) { 
     this.date = date 
    } 

    public int getUnixTimeStamp() { 
     int unixtimestamp = (int) ((this.date.getTime()) * .001); 
     return unixtimestamp; 
    } 

}

在你创建一个类角落找寻java.util.date这样,你不投的日期到你的约会。

如果仅使用此函数,则可以更简单地创建一个静态实用函数getUnixTime(Date date),该函数返回更改的日期。

0

为什么你需要让这个类扩展java.util.Date呢?创建一个静态函数,它接受一个Date并返回该日期的unix时间戳。

2

如果你是热衷于为你的子类,在你的Date类采取了java.util.Date foo实现一个构造函数,并在调用它superfoo.getTime();那么您不要只是致电Date(foo)来实例化您的子类。

0

如前所述,您可以通过让类的构造函数将时间用作输入来实现它。 事情是这样的:

公共类Date {

long unixtimestamp; 

public Date(long time) { 
    unixtimestamp = (long) (time * .001); 
} 

public long getUnixTimeStamp() { 
    return unixtimestamp; 
} 

}

另一种选择就是创建它转换它的静态方法。这取决于你是否计划在课堂上添加其他类似的功能。如果不是,那么静态方法可能会更好。

0

不,如果引用不指向派生类型的实例,则不能将类型转换为更多派生类型。

Calendar.getTime()返回的Date不是您的Date对象之一,并且它没有这些对象所具有的附加属性和行为。

您可以修改您的Date类以使用组合而不是继承,例如,

class Date { 

    private java.util.Date date; 

    public Date(java.util.Date date) { 
     this.date = date; 
    } 

    public int getUnixTimestamp() { 
     return (int)(date.getTime() * .001); 
    } 

}