2009-05-31 64 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); 
    } 

}