理解TimeUnit

3

我查看了TimeUnittoMillis()方法。

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

toMillis()方法除了抛出一个AbstractMethodError异常外,什么也不做。

那么,toMillis()方法如何将秒、分钟等转换为毫秒?


TimeUnit 基本上是抽象原型。您需要查看具体的 "TimeUnits",例如 "TimeUnit.SECONDS"。 - rethab
3个回答

7

TimeUnit 中的每个值都会覆盖它,基本上。你不会调用该实现,因为你永远不会有一个类型为 TimeUnit 的对象引用 - 它总是表示其中一个值的子类。


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

该属性从未直接被您的代码访问...


我在JDK中看到了override方法,但是当我使用反编译器来反编译JRE中的'TimeUnit'时,这些override方法并不存在。为什么会出现这种情况? - Tran Thien Chien

2

这是方法覆盖。

你可以在NANOSECONDS、MICROSECONDS等中看到被覆盖的实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接