我想要一个很好的方法从java Date对象获取当前的unix时间戳,这是我的解决方案:
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();
这会生成:线程“main”中的异常java.lang.ClassCastException:java.util.Date无法强制转换为myapp.Date
我理解为什么会出现这个异常,但有没有办法将超类强制转换为子类?如果没有,您将如何实现unixtimestamp方法?我经常在我的应用程序中使用它。
答案 0 :(得分: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)。
答案 1 :(得分:2)
如果您热衷于拥有自己的子类,请在Date
课程中使用java.util.Date foo
实施构造函数,然后使用super
调用foo.getTime()
;然后调用Date(foo)
来实例化您的子类,而不是强制转换。
答案 2 :(得分:0)
为什么你需要让这个类扩展java.util.Date呢?创建一个带有Date的静态函数,并返回该日期的unix时间戳。
答案 3 :(得分:0)
如前所述,您可以通过让类的构造函数将时间作为输入来实现它。 像这样:
公共课日期{
long unixtimestamp;
public Date(long time) {
unixtimestamp = (long) (time * .001);
}
public long getUnixTimeStamp() {
return unixtimestamp;
}
}
另一个选择就是创建一个转换它的静态方法。这取决于您是否计划在课程中添加其他类似功能。如果没有,则静态方法可能更好。
答案 4 :(得分:0)
不,如果引用未指向派生类型的实例,则无法将类型转换为更多派生类型。
Date
返回的Calendar.getTime()
不是您的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 );
}
}