Java类型转换和继承

时间:2009-05-31 22:39:28

标签: java oop casting

我想要一个很好的方法从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方法?我经常在我的应用程序中使用它。

5 个答案:

答案 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 );
    }

}