2016-10-05 2 views
3

Я рассмотрел метод TimeUnit и toMillis().Понимание TimeUnit

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

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

Итак, как метод toMillis() конвертировать секунды, минуты и т. Д. В миллисекунды?

+0

TimeUnit - это в основном абстрактный прототип. Вам нужно изучить конкретные 'TimeUnits', такие как' TimeUnit.SECONDS' – rethab

ответ

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 наносекунд, микросекунд и т.д. реализует анонимно методы, которые дают вам косвенный доступ к toMillis() поэтому этот метод

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

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

+0

Я видел методы переопределения в JDK, но когда я использовал декомпилятор для декомпиляции 'TimeUnit' из JRE. Методов переопределения там нет. Почему это происходит? –

7

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

2

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

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

Смежные вопросы