【问题标题】:Java typecasting and inheritanceJava 类型转换和继承
【发布时间】:2009-05-31 22:39:28
【问题描述】:

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

【问题讨论】:

    标签: java oop casting


    【解决方案1】:

    您不能在子类中强制转换超类,因为子类可能具有比超类更大的接口,这意味着子类可以具有超类没有的 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) 可能是一个更简单的解决方案。

    【讨论】:

      【解决方案2】:

      如果您热衷于拥有您的子类,请在您的 Date 类中实现一个构造函数,采用 java.util.Date foo 并在其中调用 superfoo.getTime();那么你只需调用Date(foo) 来实例化你的子类,而不是强制转换。

      【讨论】:

        【解决方案3】:

        为什么你需要让这个类扩展 java.util.Date 呢?创建一个静态函数,它接受一个 Date 并返回该日期的 unix 时间戳。

        【讨论】:

          【解决方案4】:

          如前所述,您可以通过让类的构造函数将时间作为输入来实现它。 像这样的:

          公开课日期{

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

          }

          另一种选择是创建一个转换它的静态方法。这取决于您是否计划在课程中添加其他类似的功能。如果不是,那么静态方法可能会更好。

          【讨论】:

            【解决方案5】:

            不,如果引用不指向派生类型的实例,则不能将类型转换为更派生的类型。

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

            【讨论】:

              猜你喜欢
              • 2013-10-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-04-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多