Java типизация и наследование - PullRequest
2 голосов
/ 01 июня 2009

Я хочу получить хороший способ получить текущую метку времени Unix из Java-объекта Date, вот мое решение:

public class Date extends java.util.Date {

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

Это прекрасно работает, но проблема в том, что когда я пытаюсь привести объект Java даты в свой пользовательский класс дат, т.е.:

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 ]

3 голосов
/ 01 июня 2009

Вы не можете привести суперкласс в подкласс, потому что у подкласса может быть больший интерфейс, чем у суперкласса, это означает, что у подкласса могут быть функции типа getUnixTimeStamp (), которых у суперкласса нет. В вашем примере это будет означать, что вы пытаетесь вызвать getUnixTimeStamp для java.util.Date.

Здесь вы можете использовать делегат или композицию вместо наследования.

Это означает, что у вас есть класс

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), которая возвращает дату изменения.

2 голосов
/ 01 июня 2009

Если вы хотите иметь свой подкласс, реализуйте конструктор в вашем классе Date, взяв java.util.Date foo и в нем вызовите super с foo.getTime(); тогда вместо того, чтобы кастовать, просто позвоните Date(foo), чтобы создать экземпляр своего подкласса.

0 голосов
/ 01 июня 2009

Нет, вы не можете привести тип к более производному типу, если ссылка не указывает на экземпляр производного типа.

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

}
0 голосов
/ 01 июня 2009

Как уже упоминалось, вы можете реализовать это, предоставив конструктору класса время на вход. Примерно так:

публичный класс Date {

long unixtimestamp;

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

public long getUnixTimeStamp() {
    return unixtimestamp;
}

}

Другой вариант - просто создать статический метод, который преобразует его. Это зависит от того, планируете ли вы добавлять другие похожие функции в класс или нет. Если нет, то статический метод, вероятно, лучше.

0 голосов
/ 01 июня 2009

Зачем вам вообще нужно расширять этот класс java.util.Date? Создайте статическую функцию, которая принимает Date и возвращает метку времени unix этой даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...