Java 类型转换和继承

标签 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

我明白为什么会出现这个异常,但是有没有办法将父类(super class)转换为子类?如果没有,你将如何实现 unixtimestamp 方法?我在我的应用程序中经常使用它。

最佳答案

您不能在子类中转换父类(super class),因为子类可能具有比父类(super class)更大的接口(interface),这意味着子类可以具有父类(super class)没有的诸如 getUnixTimeStamp() 之类的函数。在您的示例中,这意味着您尝试在 java.util.Date 上调用 getUnixTimeStamp。

您可以在此处使用委托(delegate)或组合来代替继承。

这意味着你有一个类(class)

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) 可能是一个更简单的解决方案。

关于Java 类型转换和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/933037/

相关文章:

java - 从外部 JAR 加载没有名称的 JDBC 驱动程序

java - 如何从包含数字、字符的字符串中获取整数?

java - 如何从 apache POI dataValidators 正确转换 ExplicitListValues 进行测试?

java - Java 到 Kotlin 转换后,Android Studio 找不到 R(资源)

php - $classInstance->title 比 $classInstance->getTitle() 快 - 为什么大多数人使用较慢的方法?

java - 了解 Java 中的方法

java - 公共(public)静态字段中对象的状态

c++ - C++ 风格转换对性能的影响?

c - 在 C 中是否允许/安全地在具有不同大小的结构之间进行转换?

java - 另一个支持 ejbql 连接的工具,如 Ireport (JasperReport)