2009-05-31 27 views
2

は、私はJavaのDateオブジェクトから現在のUnixタイムスタンプを取得するための良い方法をしたい、これが私のソリューションです。私のカスタム日付クラスにJavaのDateオブジェクト、すなわち:のJava型キャストと継承

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にキャストすることはできません

Iわかる なぜこの例外が作られたのですか?スーパークラスをサブクラスにキャストする方法はありますか?そうでない場合は、どのようにunixtimestampメソッドを実装しますか?私は非常に頻繁に私のアプリケーションでそれを使用します。

答えて

3

サブクラスがスーパークラスより大きいインタフェースを持つ可能性があるため、スーパークラスをサブクラスにキャストすることはできません。スーパークラスにはgetUnixTimeStamp()などのスーパークラスにはない機能があります。あなたの例では、java.util.DateでgetUnixTimeStampを呼び出そうとしています。

継承の代わりに代理人またはコンポジションを使用できます。意味

はあなたがjava.util.date arroundのクラスを作成し、あなたの日付に日付をキャストしていない。このように、クラス

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; 
    } 

}

を持っています。

この関数だけを使用すると、変更された日付を返す静的util関数getUnixTime(Date date)を作成する方が簡単な解決策になります。

0

なぜこのクラスをjava.util.Dateに拡張する必要がありますか? Dateを受け取り、その日付のunixタイムスタンプを返す静的関数を作ります。

あなたのサブクラスを持つに熱心なら
2

java.util.Date fooを取って、あなたのDateクラスのコンストラクタを実装し、それにfoo.getTime()superを呼び出します。キャストの代わりにDate(foo)を呼び出してサブクラスをインスタンス化してください。

0

すでに述べたように、クラスのコンストラクタに入力として時間をかけさせることで実装できます。このような 何か:

パブリッククラスDate {

long unixtimestamp; 

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

public long getUnixTimeStamp() { 
    return unixtimestamp; 
} 

}

別のオプションは、それを変換し、静的メソッドを作成することです。クラスに他の同様の機能を追加するかどうかによって異なります。そうでなければ、静的メソッドがおそらく良いでしょう。

0

いいえ、参照が派生型のインスタンスを指していない場合は、型を派生型にキャストできません。

Calendar.getTime()によって返されたDateは、Dateオブジェクトの1つではなく、それらのオブジェクトが行う追加の属性と動作はありません。

継承の代わりにコンポジションを使用するように、日付クラスを変更することができます。

class Date { 

    private java.util.Date date; 

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

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

}