使用instanceof返回true来扩展java.util.Date的Mask对象

时间:2018-06-24 05:51:47

标签: java

我有一个从java.util.Date扩展的类。但是,我需要确保条件instanceof Date返回false。这可能吗?原因是因为我需要重写与之集成的框架的功能,如果它的类型为Date,它将改变我的对象的行为。

import java.io.Serializable;
import java.util.Date;

public abstract class KronosDateTime extends Date implements Serializable {

    public KronosDateTime(final long time) {
        super(time);
    }

    public KronosDateTime() {
        super();
    }

    public abstract double toDoubleValue();

}


public final class KronosDateTimeImpl extends KronosDateTime {
    public KronosDateTimeImpl() {
        this(System.currentTimeMillis(),true);
    }
}

public final class Kronos {
    public static KronosDateTime call(PageContext pc) {
        KronosDateTimeImpl dateTime = new KronosDateTimeImpl(pc);
        System.out.println(dateTime instanceof java.util.Date); // Should return false
        return dateTime;
    }
}

2 个答案:

答案 0 :(得分:2)

否,不使用extends。根据定义,扩展另一个类的类的实例是两个类的实例。

但是您可以改用合成:

class KhronosDateTime /* doesn't extend Date */ {
  private final Date date;

  KhronosDateTime(long time) {
    this.date = new Date(time);
  }

  // Whatever methods using date.
}

答案 1 :(得分:1)

不可能(鉴于当前代码)。

A extends B就是说 A的任何实例也是B的实例

因此,instanceof检查将始终返回true。当然,您的代码可以避免这种检查,例如执行Eran的建议。但是没有什么能阻止其他人使用instanceof。

因此,这里的真正答案是:了解继承的含义。你不能吃蛋糕,但还是要吃。您的日期类扩展了日期,或者