Понимание TimeUnit

Я посмотрел в TimeUnit а также toMillis() метод.

 public long toMillis(long paramLong)
 {
    throw new AbstractMethodError();
 }

toMillis() метод не делать ничего, кроме как бросить AbstractMethodError исключение.

Итак, как же toMillis() метод преобразования секунд, минут и т. д. в миллисекунды?

3 ответа

Решение

Откройте TimeUnit и посмотрите константы внутри...

/**
 * Time unit representing one thousandth of a microsecond
 */
NANOSECONDS {
    public long toNanos(long d)   { return d; }
    public long toMicros(long d)  { return d/(C1/C0); }
    public long toMillis(long d)  { return d/(C2/C0); }
    public long toSeconds(long d) { return d/(C3/C0); }
    public long toMinutes(long d) { return d/(C4/C0); }
    public long toHours(long d)   { return d/(C5/C0); }
    public long toDays(long d)    { return d/(C6/C0); }
    public long convert(long d, TimeUnit u) { return u.toNanos(d); }
    int excessNanos(long d, long m) { return (int)(d - (m*C2)); }
},

/**
 * Time unit representing one thousandth of a millisecond
 */
MICROSECONDS {
    public long toNanos(long d)   { return x(d, C1/C0, MAX/(C1/C0)); }
    public long toMicros(long d)  { return d; }
    public long toMillis(long d)  { return d/(C2/C1); }
    public long toSeconds(long d) { return d/(C3/C1); }
    public long toMinutes(long d) { return d/(C4/C1); }
    public long toHours(long d)   { return d/(C5/C1); }
    public long toDays(long d)    { return d/(C6/C1); }
    public long convert(long d, TimeUnit u) { return u.toMicros(d); }
    int excessNanos(long d, long m) { return (int)((d*C1) - (m*C2)); }
},

как вы увидите, каждая константа в перечислителе TimeUnit NANOSECONDS, MICROSECONDS и т. д. реализует анонимные методы, которые дают вам косвенный доступ к toMillis() поэтому этот метод

 public long toMillis(long duration) {
        throw new AbstractMethodError();
    }

никогда не доступен вашему коду напрямую...

Каждое значение в TimeUnit в основном это переопределяет. Вы никогда не будете вызывать эту реализацию, потому что у вас никогда нет ссылки на объект типа TimeUnit - это всегда подкласс, представляющий одно из значений.

Это метод переопределения.

Вы можете увидеть переопределенные реализации в NANOSECONDS, MICROSECONDS и т. Д.

Другие вопросы по тегам